繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM