我知道为什么要将默认构造函数和复制构造函数私有化以在C ++中实现singleton类。但我不明白的是,为什么复制赋值运算符是私有的,因为不会有两个现有的对象开始。
我的探索带来两点:
根据Alexandrescu在“现代C ++设计”中的分配 运营商被私有以防止自我分配。
其次,根据rule of three,如果你定义了一个ctor, 复制一个类的ctor和赋值运算符,你应该定义 显然都是三个。那么,这是遵循这条规则的问题 仅
那么,你对此有何看法?
答案 0 :(得分:4)
我认为,禁止分配的需要更多是出于语义考虑:因为单身是唯一,所以它的赋值没有任何意义。因此,如果技术上可以以合理的方式实现分配,那么从逻辑上讲,您无论如何都需要禁止它。
因为必须永远不需要复制单例,所以必须禁止操作。否则就会出现混淆和错误的空间:开发人员会尝试使用它(如果允许的话)(并想知道出了什么问题)。
良好的设计可以最大限度地减少WTF的数量。
答案 1 :(得分:2)
没有
在单身人士中,您希望管理所有可能的构造,分配和销毁。通过完成所有这些操作private
,您实际上只是阻止他人使用它们。
另请注意,通常复制构造和复制赋值将被声明为private
以防止从外部调用但不会被定义,因为它们在实践中未被使用...因此如果它们是链接器会抱怨。
在C ++ 11中,您将复制构造和副本分配声明为delete
d。