单例实现 - 为什么需要复制构造函数?

时间:2014-10-08 20:51:46

标签: c++ singleton operator-overloading copy-constructor

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

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&);。有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:5)

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

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

    // Utilizes the operator=
    x = Foo::getInstance();
}

请注意,我们已在该代码的末尾创建了3个Foo的新实例。

答案 1 :(得分:2)

防止意外分配单身。

使用私有拷贝构造函数时,以下代码将无法编译:

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

使用private无参数构造函数时,以下代码将无法编译:

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

您可以通过 getInstance()静态函数,使用此体操来确保使用您的单身人士的人将按照预期的方式使用它。

答案 2 :(得分:1)

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

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

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