复制构造函数应该是私有的还是公共的

时间:2012-02-23 16:36:02

标签: c++ private copy-constructor public

我正在编写一个抽象类,它将成为其他几个类的父类。我认为复制构造函数应该是私有的,因为你使用的是抽象类,没有什么可以复制的。但是,我不是100%肯定。

我是否正确,如果我不是为什么要公开或受到保护?

3 个答案:

答案 0 :(得分:8)

如果您不希望复制类的对象,则复制构造函数应该是私有的。否则,它应该是公开的。

答案 1 :(得分:6)

我认为protected是最好的选择:它决定对象是否可以复制到派生类,同时禁止在抽象类级别进行复制,防止可怕的object slicing

答案 2 :(得分:3)

通过将复制构造函数设为私有,您将有助于防止无意中的对象切片,其中您创建派生类的副本但会丢失该派生类的所有属性。派生类可以创建自己的公共副本构造函数并做正确的事。

当抽象类具有数据成员时,有一种情况是复制构造函数应该受到保护而不是私有。这种情况不会经常发生。基类可以复制基类成员,而派生类复制自己的成员。

class AbstractBase
{
public:
    AbstractBase(const std::string &init) : wtf(init) {}
    virtual ~AbstractBase() {}
    void DoSomething() = 0;
protected:
    AbstractBase(const AbstractBase &r) : wtf(r.wtf) {}

    const std::string wtf;
};

class Derived : public AbstractBase
{
public:
    // ...
    Derived(const Derived &r) : AbstractBase(r), moredata(r.moredata) {}
private:
    int moredata;
};