如何在C ++中编写复制构造函数和赋值运算符的清单?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

请写一份复制构造函数和赋值操作符在C ++中需要做的任务列表,以保持异常安全性,避免内存泄漏等。

提问于
用户回答回答于

首先确定你确实需要支持复制。大多数情况下情况并非如此,因此禁用这两种方法都是可行的。

有时,你仍然需要在多态层次结构中为类提供重复,在这种情况下:禁用赋值运算符,编写(受保护的)复制构造函数,并提供虚拟clone()函数。

否则,如果你正在写一个价值课,你就回到了Coplien正交典型形式的土地上。如果你有一个不能被简单拷贝的成员,你需要提供一个拷贝构造函数,析构函数,赋值运算符和默认构造函数。

用户回答回答于

编译器生成的版本在大多数情况下工作。

当你的对象包含一个RAW指针(一个没有RAW指针的参数)时,你需要考虑一下这个问题。所以你有一个RAW指针,第二个问题是你是否拥有指针(它是否被你删除)?如果是这样,那么你将需要应用4的规则。

拥有超过1个RAW指针变得越来越难以正确执行(复杂性的增加也不是线性的[但这是观察性的,我没有真正的统计数据来支持这种说法])。所以,如果你有超过1个RAW指针考虑将它们包装在自己的类中(某种形式的智能指针)。

规则4:如果一个对象是RAW指针的所有者,那么你需要定义以下4个成员以确保正确处理内存管理:

  • 构造函数
  • 复制构造函数
  • 作业操作员
  • 析构函数

你如何定义这些将取决于情况。但需要注意的是:

  • 默认构造:将指针设置为NULL
  • 复制构造函数:使用复制和交换标识来提供“强大的例外保证”
  • 分配操作员:检查分配给自己
  • 析构函数:防止从析构函数传出的异常。

扫码关注云+社区