我对单例设计模式的怀疑是,仅仅使构造函数私有就足够了。我认为没有必要将复制构造函数和赋值运算符设为私有。
由于我们无法创建对象(对象将由静态函数创建,并将在静态指针中分配),因此不会调用复制构造函数或赋值运算符。这是对的吗?
错误的。如果收到指向内部分配的实例的指针,如果复制构造函数是公共的,则仍可以创建该实例的副本。例如:
Singleton * s = Singleton::getInstance();
Singleton copy = *s; // <-- invokes copy constructor
赋值运算符的类似问题:
Singleton * s1 = Singleton::getInstance();
Singleton * s2 = Singleton::getInstance();
*s1 = *s2; // <-- invokes assignment operator (although self-assignment...)
这两者都不会造成太大伤害,但它们违反了单例模式的意图。
通过将复制构造函数和赋值运算符设为私有,可以解决问题。从 C++11 开始,您还可以通过写入"删除"它们
Singleton(const Singleton&) = delete; // copy constructor
Singleton & operator=(const Singleton&) = delete; // assignment operator
无需将复制构造函数(和赋值运算符)设为私有,因为默认情况下它们将使用浅拷贝。但是,为什么要在 Singleton 类中实现复制构造函数?如果你实现一个复制构造函数,并在其中实现深度复制,并保持公共,那么可以创建类的多个对象。
如果您使用的是 C++11,最好删除它们:
MyClass (MyClass const &) = delete;
MyClass & operator = (MyClass const &) = delete;