在这种情况下,我们需要禁用默认复制构造函数并分配运算符?

时间:2015-03-18 11:08:15

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

如果我们将复制构造函数和赋值运算符设置为私有并且不提供任何实现,它们将被禁用,如下所示:

class Test
{
   priavate:
       Test(const Test&);
       Test& operator=(const Test&);
};

但在哪种情况下我们需要这样做?我的意思是我们什么时候应该这样做呢?

2 个答案:

答案 0 :(得分:6)

当您希望此类的对象不可复制时。

可能有许多原因导致对象无法或不应该复制到其他对象。一些例子是:

  1. 日志文件
  2. 一些突变
  3. 单身模式
  4. 对象工厂
  5. 某些版本的智能指针
  6. 对于上面的示例,编译器提供的默认复制构造函数版本和默认赋值运算符可能会导致意外结果。

    onwarnds,您可以使用=delete语法删除编译器提供的默认版本。

    另一种用途是仅通过类实用程序virtual Base* clone()强制(限制)对象的复制。

    相关:Rule of three or rule of five

答案 1 :(得分:1)

另一个常见的情况是,当对象不是浅层可复制的并且编写该类的人不想为它实现深层复制时,所以他留下了这两个残疾人,无论是否有关于理由的评论。

例如,当构造函数new是一个数组和析构函数delete时,那么该对象不是可浅层复制的。要实现深层复制,复制构造函数需要新建一个相同大小的空数组,然后复制每个元素,并且在执行相同操作之前,复制赋值必须delete旧的。

要编写很多样板代码。而且运行也需要时间。

因此,如果此类对于实现是私有的,并且copy-constructor和copy-assignment既不是强制性的也不是有用的,为什么不禁用它们呢?