c++ - 何时删除复制构造函数和赋值运算符?

标签 c++ oop constructor copy singleton

这个问题在这里已经有了答案:





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/

相关文章:

c++ - 哪些选项(如果有)在 Visual Studio 2015 中暗示/CLR

java - 使用 OOP 的多个着色器、对象和 Material

c++ - 使用两个不同的构造函数初始化指向数组的指针

c++ - 删除导致意外崩溃

java - 为什么 javac 在不创建任何实例的类中创建 <init> 方法

c# - 托管 .NET 等同于 WinBase 的 CreateFile 和 WriteFile (kernel32.dll)

c++ - 虚函数——vtable

c++ - 制作 lambda constexpr 的要求是什么?

c++ - 保持模块独立,同时仍然相互使用

php - 为什么不能在类定义中包含 require* 语句?