2013-04-06 49 views
0

根据this question,当对象按值传递给另一个函数时,会调用一个拷贝构造函数。为什么按值传递一个对象即使该对象没有拷贝构造函数也能工作?

我打消了我的拷贝构造函数的测试,但仍然可以按值传递。这有意义吗?

我注释掉拷贝构造函数:

/* 
Matrix4(const Matrix4<T>& m) 
{ 
    x.x = m.x.x; x.y = m.x.y; x.z = m.x.z; x.w = m.x.w; 
    y.x = m.y.x; y.y = m.y.y; y.z = m.y.z; y.w = m.y.w; 
    z.x = m.z.x; z.y = m.z.y; z.z = m.z.z; z.w = m.z.w; 
    w.x = m.w.x; w.y = m.w.y; w.z = m.w.z; w.w = m.w.w; 
} 
*/ 

typedef Matrix4<float> mat4; 

那么这个编译并运行良好:

void ttt(mat4 hi){ 

} 

void yyy(){ 
    mat4 x; 
    ttt(x); 
} 

因此,也许拷贝构造函数是不是在这种情况下叫什么名字?这里发生了什么?

回答

3

如果不提供拷贝构造函数,编译器生成一个对你来说,它被用来当你路过值(在C++ 11还有一招拷贝构造函数被调用在某些情况下可能)。为了真正禁用它,你应该声明它私有的,或者delete它在C++ 11:

class Foo 
{ 
private: 
    Foo(const Foo&); 
}; 

class Foo11 
{ 
public: 
    Foo(const Foo&) = delete; 
}; 
0

如果没有指定的构造函数,C++创建一个无参数,并通过自身的拷贝构造函数。它只是执行对象的副本。

+0

C++不会生成任何东西,因为它是一种抽象概念,一种编程语言。生成构造函数的东西是编译器。 – 2013-04-06 06:44:43

+1

'执行对象的成员方式副本'是表达它的正常方式。有很多方法可以复制,编译器生成的默认值可能不是正确的。 – john 2013-04-06 06:45:33

+0

@ H2CO3 C++强制编译器生成构造函数:) – juanchopanza 2013-04-06 06:45:38

相关问题