为什么要使用复制构造函数C++

bap*_*api 0 c++

据我所知,当我们分配一个对象时,将调用另一个默认的复制构造函数.

class class1 obj1;
class class2 obj2;
obj1(obj2); //default copy constructor will be called by compiler 
Run Code Online (Sandbox Code Playgroud)

那么,我什么时候应该明确写出复制构造函数?

Som*_*ude 8

在您的情况下,将调用复制赋值运算符,而不是复制构造函数.要调用copy-constructor,你可以这样做,例如

class1 obj1;
class1 obj2 = obj1;  // Invokes the copy-constructor in obj2
Run Code Online (Sandbox Code Playgroud)

通过阅读三规则,可以看到何时编写复制构造函数(或复制赋值运算符或析构函数).简而言之,如果您有任何析构函数,复制构造函数或复制赋值运算符,那么您应该拥有所有这些.


此外,虽然编译器将为您自动生成复制构造函数和复制赋值运算符,但如果您不提供自己的,则必须记住这些自动生成的函数只会执行浅复制.如果您在对象中分配了指向内存的指针,则自动生成的函数将仅复制实际指针,而不是复制指向的指针.这意味着在复制后,您有两个指向同一内存的对象.如果你delete在析构函数中指针,并且其中一个对象被破坏,那么另一个对象仍然会有它的指针,但它现在将指向已删除的内存.