我知道为什么要将默认构造函数和复制构造函数设为私有以在 C++ 中实现单例类。但我不明白的是,为什么要将复制赋值运算符设为私有,因为不会有两个现有对象开始。
我的探索带来两点:
根据 Alexandrescu 在“现代 C++ 设计”中的说法,赋值运算符应设为私有以防止自赋值。
其次,根据三规则,如果你为一个类定义了ctor、copy ctor和赋值运算符之一,你应该明确定义所有三个。那么,是否仅遵循此规则。
那么,您对此有何看法?
我知道为什么要将默认构造函数和复制构造函数设为私有以在 C++ 中实现单例类。但我不明白的是,为什么要将复制赋值运算符设为私有,因为不会有两个现有对象开始。
我的探索带来两点:
根据 Alexandrescu 在“现代 C++ 设计”中的说法,赋值运算符应设为私有以防止自赋值。
其次,根据三规则,如果你为一个类定义了ctor、copy ctor和赋值运算符之一,你应该明确定义所有三个。那么,是否仅遵循此规则。
那么,您对此有何看法?
我认为,禁止赋值的需要更多是出于语义考虑:由于单例是唯一的,因此对其进行赋值没有任何意义。因此,如果以合理的方式实现分配在技术上甚至是可能的,那么从逻辑上讲,无论如何您都需要禁止它。
因此,正是因为永远不需要复制单例,所以必须禁止该操作。否则会有混淆和错误的空间:如果允许,开发人员会尝试使用它(并想知道有什么问题)。
好的设计可以最大限度地减少 WTF 的数量。
No.
In a Singleton you want to manage all possible construction, assignment and destruction. By making all those operations private
you actually just prevent others from using them.
Also note that typically copy construction and copy assignment will be declared private
to prevent invocation from outside but will not be defined because they are not used in practice... and so if they were the linker would complain.
In C++11 you would declare copy construction and copy assignment as delete
d.