我应该何时定义自己的副本ctor和赋值运算符

sky*_*oor 5 c++

我正在阅读第5项中有效的C++,它提到了两种我必须自己定义复制赋值运算符的情况.该案例是一个包含const和引用成员的类.

我写信是为了询问我必须定义自己的复制构造函数和赋值运算符的一般规则或情况是什么?

我还想知道何时必须定义自己的构造函数和析构函数.

非常感谢!

Phi*_*ter 5

在以下情况下,您必须创建自己的复制构造函数和赋值运算符(通常也是默认构造函数):

  • 您希望复制或分配对象,或将其放入标准容器中,例如 vector
  • 默认的复制构造函数和赋值运算符不会执行正确的操作.

请考虑以下代码:

class A; // defined elsewhere
class B {
private:
    A *my_very_own_a;
};
Run Code Online (Sandbox Code Playgroud)

如果让自动复制构造函数复制a B,它将复制A *指针值,以便复制指向A与原始相同的实例.但是这个类的部分设计是每个B都有自己的A,所以自动复制构造函数已经打破了这个契约.所以你需要编写自己的拷贝构造函数,它将A为新B的指向创建一个新的构造函数.

但是,考虑这种情况:

class A; // defined elsewhere
class B {
private:
    A *shared_reference_to_a;
};
Run Code Online (Sandbox Code Playgroud)

这里每个都B包含一个指向a的指针A,但是类合约并不要求A每个都有唯一的B.所以自动复制构造函数可能会在这里做正确的事情.

请注意,两个示例都是相同的代码,但具有不同的设计意图.

第一种情况的示例可能是B==对话框,A==按钮.如果创建对话框的副本,则可能还需要所有内容的副本.

第二个例子可能是B==对话框,A==对窗口管理器的引用.如果复制对话框,则副本可能与原始窗口管理器位于同一窗口管理器中.