条款12:复制对象时勿忘其每一部分
1、所谓copying
函数
是指:
- 复制构造函数
- 赋值符号函数
二者统称为:copying
函数。
2、上述两个函数的特点
一个类中一定会有这两个函数,如果没有手动写,那么编译器则会自动生成缺省的这两个函数。如果手动写的话,则需要引起一定的重视,即:复制对象时勿忘其每一部分。
3、被遗漏的部分通常指的是什么情况下,哪里被遗漏?
情况一:为一个类添加新的成员变量时。此时,必须更新所有的构造函数,使新添加的成员变量被初始化。
情况二:这样的自定义copying
函数的类,被派生类继承时,派生类的copying
函数必须调用base class
的copying
函数。
4、遗漏上述情况的后果
情况一:编译器不会给出提示,可能导致不确定行为。
情况二:因为基类成员变量往往是私有变量,因此不能够直接通过派生类访问基类成员变量。因此只能通过构造函数进行初始化。如果派生类的copying函数没有显式调用base class 的copying函数,则会调用默认构造函数,此时能够通过编译。如果没有默认构造函数,则不能通过编译。
5、关于赋值符号函数和复制构造函数的代码重复问题的解决方案
错误的做法:
赋值符号函数和复制构造函数所做的工作是非常类似的,代码的重复度比较高。但是不能够通过赋值符号函数调用复制构造函数或复制构造函数调用赋值符号函数来解决重复性问题。这两种使用方法都不合乎逻辑。
正确的做法是:
将二者重复部分抽取出来,做出一个成员函数。这样的成员函数通常命名为Init,且一般设置为私有的。