这个问题在这里已经有了答案:
Why and when delete copy constructor and operator=
(2 个回答)
1年前关闭。
我经常看到这样的(简化的)代码:
class A {
public:
A(int a) :a{a} {}
A(const A&) = delete;
A& operator=(const A&) = delete;
private:
int a;
}
然后,在整个程序中,类 A 仅被实例化一次。
删除复制构造函数和
operator=
的实际原因是什么?同时不是 使类单例?
最佳答案
When to delete copy constructor and assignment operator?
当隐式生成的构造函数违反任何类不变量时,应该定义复制构造函数(和赋值)。
当它不能以不会有不受欢迎或令人惊讶的行为的方式编写时,它应该被定义为删除。
可能最简单的例子是类
std::unique_ptr
.顾名思义,它拥有一个指针值的唯一所有权。复制内部指针会违反唯一所有权的不变量。这就是隐式复制构造函数(和赋值)会做的事情。但也没有合理的选择。也许您可以实现一个动态分配新对象的复制构造函数,并从最初指向的对象复制初始化它。但是这个指针将与普通指针有不同的行为,普通指针的拷贝不会导致分配或创建新的指向对象,这可能是令人惊讶和不可取的。此外,std::unique_ptr
还需要可用于本身可能不可复制的尖头类型。
关于c++ - 何时删除复制构造函数和赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59514567/