在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
In C++, can I skip defining assignment operator after defining my own copy constructor?
当我定义一个类时,如果我需要深度复制,我需要定义我自己的复制构造函数。 那么,是否还需要定义赋值运算符? 如果跳过它,作业是否执行浅拷贝?
是的,你需要。这被称为三法则:当定义了复制 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) {}
};
这被称为零法则
相关文章:
- 重载Singly Linked List中的赋值运算符
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++ 通过自定义赋值运算符隐式转换函数参数
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- 为什么定义移动构造函数会删除移动赋值运算符
- 枚举的复合赋值运算符真的应该根据其关联的算术运算符来定义吗?
- 类模板的用户定义赋值运算符时遇到问题
- 为什么定义了移动构造函数并隐式删除了赋值运算符?
- 当我只想禁用自定义赋值运算符=()的签名时,它是否重要
- 只手动定义复制构造函数和赋值运算符的一部分
- 自定义位数组[]和赋值运算符
- 如何在 C++ 中定义头文件之外的赋值运算符
- 何时提供用户定义的复制构造函数和赋值运算符
- 为什么函数中本地定义的结构需要赋值运算符和复制构造函数
- 如果未定义赋值运算符,是否调用复制构造函数?
- 定义赋值运算符 = 只允许零 RHS,否则无法编译
- 编译器的区别:扩展x3::变体需要用gcc定义复制构造函数、复制赋值运算符和默认构造函数,但不需要clang
- 如何为自定义字符串类型编写构造函数/赋值运算符重载
- 定义赋值运算符和复制构造函数
- 是在C++中独立定义的算术/赋值运算符和复合赋值运算符