[英]Use of copy constructor and assignment operator in singleton design pattern
我对Singleton设计模式的怀疑是,是否足以将构造函数设为私有。 我认为没有必要将复制构造函数和赋值运算符设为私有。
由于我们无法创建对象(对象将由静态函数创建,并将在静态指针中分配),因此将不会调用复制构造函数或赋值运算符。 这是正确的吗?
错了 如果收到指向内部分配的实例的指针,则在复制构造函数为public的情况下,仍可以对其进行复制。 例如:
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...)
这两个都不会造成太大的伤害,但是它们违反了Singleton模式的意图。
通过将复制构造函数和赋值运算符都设为私有,可以解决此问题。 从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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.