为什么在C ++中为单例类重载复制赋值运算符?

时间:2012-04-15 12:21:22

标签: c++ design-patterns

我知道为什么要将默认构造函数和复制构造函数私有化以在C ++中实现singleton类。但我不明白的是,为什么复制赋值运算符是私有的,因为不会有两个现有的对象开始。

我的探索带来两点:

  1. 根据Alexandrescu在“现代C ++设计”中的分配 运营商被私有以防止自我分配。

  2. 其次,根据rule of three,如果你定义了一个ctor, 复制一个类的ctor和赋值运算符,你应该定义 显然都是三个。那么,这是遵循这条规则的问题 仅

  3. 那么,你对此有何看法?

2 个答案:

答案 0 :(得分:4)

我认为,禁止分配的需要更多是出于语义考虑:因为单身是唯一,所以它的赋值没有任何意义。因此,如果技术上可以以合理的方式实现分配,那么从逻辑上讲,您无论如何都需要禁止它。

因为必须永远不需要复制单例,所以必须禁止操作。否则就会出现混淆和错误的空间:开发人员尝试使用它(如果允许的话)(并想知道出了什么问题)。

良好的设计可以最大限度地减少WTF的数量。

答案 1 :(得分:2)

没有

在单身人士中,您希望管理所有可能的构造,分配和销毁。通过完成所有这些操作private,您实际上只是阻止他人使用它们。

另请注意,通常复制构造和复制赋值将被声明为private以防止从外部调用但不会被定义,因为它们在实践中未被使用...因此如果它们是链接器会抱怨。

在C ++ 11中,您将复制构造和副本分配声明为delete d。