在这种情况下我们需要禁用默认的复制构造函数和赋值运算符?
in which case we need to disable default copy constructor and assign operator?
如果我们将复制构造函数和赋值运算符设为私有并且不提供任何实现,它们将被禁用,如下所示:
class Test
{
private:
Test(const Test&);
Test& operator=(const Test&);
};
但在什么情况下我们需要这样做?我的意思是我们什么时候应该这样做?
当您希望此 class 的对象不可复制时。
无法或不应将对象复制到其他对象的原因可能有很多。一些例子是:
- 日志文件
- 一些突变体
- 单例模式
- 对象工厂
- 一些版本的智能指针
对于上述示例,编译器提供的默认复制构造函数和默认赋值运算符版本可能会导致意外结果。
c++11 onwarnds,您可以使用=delete
语法删除编译器提供的默认版本。
另一个用途是强制(限制)仅通过 class 实用程序 virtual Base* clone()
复制对象。
另一种常见情况是对象不可浅复制,编写 class 的人不想为其实现深复制,所以他将这两个禁用,有或没有评论关于理由。
例如,当构造函数 new
是一个数组而析构函数 delete
是它时,则该对象不可浅复制。要实现深度复制,复制构造函数需要新建一个相同大小的空数组,然后复制每个元素,而复制赋值必须delete
旧数组,然后再做同样的事情。
需要编写大量样板代码。而且 运行 也需要时间。
因此,如果此 class 对某个实现是私有的,并且复制构造函数和复制赋值既不是强制性的也没有帮助,为什么不禁用它们呢?
如果我们将复制构造函数和赋值运算符设为私有并且不提供任何实现,它们将被禁用,如下所示:
class Test
{
private:
Test(const Test&);
Test& operator=(const Test&);
};
但在什么情况下我们需要这样做?我的意思是我们什么时候应该这样做?
当您希望此 class 的对象不可复制时。
无法或不应将对象复制到其他对象的原因可能有很多。一些例子是:
- 日志文件
- 一些突变体
- 单例模式
- 对象工厂
- 一些版本的智能指针
对于上述示例,编译器提供的默认复制构造函数和默认赋值运算符版本可能会导致意外结果。
c++11 onwarnds,您可以使用=delete
语法删除编译器提供的默认版本。
另一个用途是强制(限制)仅通过 class 实用程序 virtual Base* clone()
复制对象。
另一种常见情况是对象不可浅复制,编写 class 的人不想为其实现深复制,所以他将这两个禁用,有或没有评论关于理由。
例如,当构造函数 new
是一个数组而析构函数 delete
是它时,则该对象不可浅复制。要实现深度复制,复制构造函数需要新建一个相同大小的空数组,然后复制每个元素,而复制赋值必须delete
旧数组,然后再做同样的事情。
需要编写大量样板代码。而且 运行 也需要时间。
因此,如果此 class 对某个实现是私有的,并且复制构造函数和复制赋值既不是强制性的也没有帮助,为什么不禁用它们呢?