在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?

In C++, can I skip defining assignment operator after defining my own copy constructor?

本文关键字:定义 赋值运算符 复制 C++ 我可以 自己的 构造函数      更新时间:2023-10-16

当我定义一个类时,如果我需要深度复制,我需要定义我自己的复制构造函数。 那么,是否还需要定义赋值运算符? 如果跳过它,作业是否执行浅拷贝?

是的,你需要。这被称为三法则:当定义了复制 ctor、赋值运算符或 dtor 之一时,可能必须定义另外两个。存在例外情况,但在标准情况下,您必须...

自C++11以来,五法则适用于解决移动语义。

通常最好定义数据成员,这样就不需要编写复制构造函数(也不需要编写复制赋值运算符(。

而不是

class Foo {
Bar * data = nullptr;
public:
explicit Foo(const Bar & x) : data(new Bar(x)) {}
~Foo() { delete data; }
Foo(const Foo & other) : data(new Bar(*other.data)) {}
Foo& operator=(const Foo & other) { delete data; data = new Bar(*other.data); return *this; }
};

你有

class Foo {
Bar data;
public:
explicit Foo(const Bar & x) : data(x) {}
};

这被称为零法则