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

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

提问人:cathgreen 提问时间:12/3/2019 最后编辑:TonySalimicathgreen 更新时间:12/3/2019 访问量:140

问:

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

C++ OOP C++11 复制构造函数 赋值运算符

评论

0赞 freakish 12/3/2019
你试试看会发生什么怎么样?
2赞 Max Langhof 12/3/2019
@freakish 不建议通过反复试验来学习C++。当然,你可以检查编译器是否拒绝你的代码(在这种情况下,你可以确定代码是错误的),但你不能以这种方式确认代码的有效性。
0赞 freakish 12/3/2019
@MaxLanghof你的意思是不推荐。这个问题可以通过简单的检查轻松解决。因此,我们可以同意不同意。
0赞 Caleth 12/3/2019
@freakish,在这种情况下,行为可以通过观察来学习。在其他情况下,“尝试一下,看看会发生什么”会导致未定义的行为。
0赞 Jean-Baptiste Yunès 12/3/2019
@freakish如果 OP 尝试使用具有深度复制语义的字段怎么办?

答:

5赞 Jean-Baptiste Yunès 12/3/2019 #1

是的,你需要。这被称为三法则:当定义 copy-ctor、assignment-operator 或 dtor 之一时,可能必须定义另外两个。存在例外情况,但在标准情况下,您必须...

从 C++ 11 开始,五法则适用于处理移动语义。

1赞 Caleth 12/3/2019 #2

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

而不是

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) {}
};

这被称为零法则