为什么我要将复制构造函数和赋值运算符设为私有并在C ++中实现?

时间:2011-07-25 11:14:53

标签: c++ copy-constructor assignment-operator

this question的启发。

通常,复制构造函数和赋值运算符private的原因是make the class non-copyable,因此只能创建和销毁对象,但不能复制 - 大多数情况下,因为复制它们会毫无意义。在这种情况下,复制构造函数和赋值运算符都是private 而未实现 - 如果该类不可复制,则无人应该复制。

是否存在复制构造函数和赋值运算符需要private并且同时具有有意义的实现的情况?

3 个答案:

答案 0 :(得分:8)

我的猜测是,这对于持有自己列表的类很有用 - 然后它可以在内部复制实例。这实际上只对项目和容器的类有用:

class MyItems
{
private:
    /* Copy ctor and =operator */
    List list;
public:
    void AddItems(MyItems* items)
    {
        MyItems* added = new MyItems(items);
        list.Add(added);
    }
};

另一个想法是允许在班级控制的情况下进行克隆。当复制有意义时,这可能很有用,但仅限于特定条件或权限:

class MyClass
{
private:
    /* Copy ctor and =operator */
public:
    MyClass* clone()
    {
        if (canClone)
        {
            MyClass* cloned = new MyClass(this);
            return cloned;
        }
        else
        {
            return NULL;
        }
    }
};

答案 1 :(得分:8)

有两种情况立即浮现在脑海中:

  1. friend S:

    假设,作为设计的一部分,你有两个高度耦合的类,其中一个需要能够复制另一个(比如,在工厂模型或其他类似),但你不想让整个世界都能复制它。

  2. 包装:

    假设您希望能够有条件地克隆某些元素,具体取决于某些内部行为(例如,取决于某些类状态条件) - 从语言角度来看,最简洁的方法仍然是将复制分离为自己的功能。这样可以很好地分离关注点。

答案 2 :(得分:7)

  1. 我们使复制构造函数和operator =未实现,以便均匀 friend无权访问它。如果你实施,就意味着 您希望friend有权访问。这是一项设计决定。
  2. 您想要进行显式克隆;即允许复制,但也 使其代码“看起来很脏”(类似于C ++风格的转换 操作,显示dirt in your code
  3. e.g。

    class A {
      A(const A& obj) { ... }
      A& operator = (const A& obj) { ... }
    public:
      A& clone(const A& obj)
      {
        *this = obj;
        return *this;
      }
    };
    

    我们已经使用此包装器clone()来允许用户进行克隆,但是它也明确地显示了他/她正在做什么。

相关问题