Singleton实现-为什么需要复制构造函数

Singleton implementation - why is a copy constructor needed?

本文关键字:复制 构造函数 为什么 实现 Singleton      更新时间:2023-10-16

我在网上找到了单例设计模式的代码:

class Foo
{
public:
    static Foo& getInstance()
    {
        static Foo instance;
        return instance;
    }
private:
    Foo() {};
    Foo(Foo const&);
    Foo& operator=(Foo const&);
}

我不明白为什么构造函数Foo(Foo const&);Foo& operator=(Foo const&);都需要。有人能给我解释一下吗?

您不希望以下代码失败吗?

int main() {
    // Utilizes the copy constructor
    Foo x = Foo::getInstance();
    Foo y = Foo::getInstance();
    // Utilizes the operator=
    x = Foo::getInstance();
}

请注意,在该代码结束时,我们已经创建了Foo的3个新实例。

复制构造函数和赋值运算符在私有部分中声明,而没有定义,这意味着实际上没有人可以使用它们,因此无法创建Foo的副本。

请注意,在C++11中,这可以用更直接的方式实现:

// this can be even in public section
Foo(Foo const&) = delete;
Foo& operator=(Foo const&) = delete;

防止意外分配单例

使用私有副本构造函数,以下代码将不会编译:

Foo foo = Foo::getInstance(); // error: ‘Foo::Foo(const Foo&)’ is private

使用私有无参数构造函数,以下代码将不会编译:

Foo foo2; // error: ‘Foo::Foo()’ is private

通过getInstance()静态函数,您可以使用这个技巧来确保使用您的singleton的人能够按照预期的方式使用它。