我知道在 c++ 中会调用复制构造函数的以下情况:
当一个现有的对象被分配一个它自己的类的对象时
MyClass A,B; A = new MyClass(); B=A; //copy constructor called
如果函数接收作为参数,按值传递的类的对象
void foo(MyClass a); foo(a); //copy constructor invoked
当函数返回(按值)类的对象时
MyClass foo () { MyClass temp; .... return temp; //copy constructor called }
请随时纠正我所犯的任何错误;但是我更好奇是否还有其他调用复制构造函数的情况。
最佳答案
When an existing object is assigned an object of it own class
B = A;
不一定。这种赋值称为copy-assignment,意思是调用类的赋值运算符对所有数据成员进行成员赋值。实际函数是 MyClass& operator=(MyClass const&)
此处不调用复制构造函数。这是因为赋值运算符引用了它的对象,因此不执行复制构造。
复制分配不同于复制初始化,因为复制初始化仅在对象被初始化时进行。例如:
T y = x;
x = y;
第一个表达式通过复制 x
来初始化 y
。它调用复制构造函数 MyClass(MyClass const&)
。
如前所述,x = y
是对赋值运算符的调用。
(还有一个叫做 copy-elison 的东西,编译器会省略对复制构造函数的调用。你的编译器很可能会使用它)。
If a functions receives as argument, passed by value, an object of a class
void foo(MyClass a); foo(a);
这是正确的。但是,请注意,在 C++11 中,如果 a
是一个 xvalue,并且如果 MyClass
具有适当的构造函数 MyClass(MyClass&&)
, 一个
可以是moved进入参数。
(copy-constructor和move-constructor是类的两个默认编译器生成的成员函数。如果你自己不提供,编译器会在特定情况下慷慨地为你提供) .
When a function returns (by value) an object of the class
MyClass foo () { MyClass temp; .... return temp; // copy constructor called }
通过 return-value optimization ,正如一些答案中提到的,编译器可以删除对复制构造函数的调用。通过使用编译器选项 -fno-elide-constructors
,您可以禁用复制 elison 并查看在这些情况下确实会调用复制构造函数。
关于c++ - 在哪些情况下调用 C++ 复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21206359/