【问题标题】:When to delete copy constructor and assignment operator? [duplicate]何时删除复制构造函数和赋值运算符? [复制]
【发布时间】:2020-04-18 05:45:00
【问题描述】:

我经常看到这样的(简化的)代码:

class A {
public:
    A(int a) :a{a} {}

    A(const A&) = delete;
    A& operator=(const A&) = delete;

private:
    int a;
}

然后,在整个程序中,类 A 只被实例化一次。

删除复制构造函数和operator= 同时创建类 Singleton 的实际原因是什么?

【问题讨论】:

标签: c++ oop constructor copy singleton


【解决方案1】:

什么时候删除拷贝构造函数和赋值运算符?

当隐式生成的构造函数违反任何类不变量时,应定义复制构造函数(和赋值)。

当它不能以不会有不良或令人惊讶的行为的方式编写时,它应该被定义为删除。

可能最简单的例子是类std::unique_ptr。顾名思义,它拥有一个指针值的唯一所有权。复制内部指针会违反唯一所有权的不变量。这就是隐式复制构造函数(和赋值)会做的事情。但也没有合理的选择。也许您可以实现一个动态分配新对象的复制构造函数,并从最初指向的对象复制初始化它。但是这个指针与普通指针的行为不同,普通指针的复制不会导致分配或创建新的指向对象,这可能是令人惊讶和不受欢迎的。此外,std::unique_ptr 还需要可用于本身可能不可复制的指针类型。

【讨论】:

    【解决方案2】:

    如果您有一个类具有分配动态内存的 var,并且您不想制作合适的复制 ctor 和 cpy 赋值运算符来分配新内存以避免两个指针指向同一事物,则可以删除整个 cpy ctor 和 cpy 赋值运算符。

    如果你想禁止按值传递对象,你也可以删除它们。

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2011-06-09
      相关资源
      最近更新 更多