根据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);
}
所以也许在这种情况下不会调用复制构造函数?这里发生了什么?
答案 0 :(得分:3)
如果您不提供复制构造函数,编译器会为您生成一个,当您按值传递时会使用它(在C ++ 11中,在某些情况下也可能会调用移动复制构造函数)。 )要真正禁用它,您应该将其声明为私有,或者在C ++ 11中声明delete
:
class Foo
{
private:
Foo(const Foo&);
};
class Foo11
{
public:
Foo(const Foo&) = delete;
};
答案 1 :(得分:0)
如果没有指定构造函数,C ++自己创建一个无参数构造函数和一个复制构造函数。它只是执行对象的副本。