在单例设计模式中使用复制构造函数和赋值运算符



我对单例设计模式的怀疑是,仅仅使构造函数私有就足够了。我认为没有必要将复制构造函数和赋值运算符设为私有。

由于我们无法创建对象(对象将由静态函数创建,并将在静态指针中分配),因此不会调用复制构造函数或赋值运算符。这是对的吗?

这是

错误的。如果收到指向内部分配的实例的指针,如果复制构造函数是公共的,则仍可以创建该实例的副本。例如:

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;

最新更新