重点:了解C++自动合成和调用的缺省构造、Copy构造、赋值和析构函数。
即使你定义了一个空类,C++编译器也会为你生成上述函数。准确地说,是在需要的时候生成。见而言之,它们做以下工作:
- 缺省构造和析构,调用基类和成员对象的缺省构造和析构函数
- copy构造和赋值操作,简单地复制每一个成员对象的值。对于基本类型,就是bitwise复制。
《C++对象模型》[1]中对缺省构造函数有更多的说明。以下四种情况,编译器会合成缺省的构造函数:
1) 成员对象有缺省的构造函数时,将调用其缺省构造函数
2) 基类有缺省构造函数时,会调用基类的构造函数
3) 类中声明了虚函数时,则会生成虚函数指针、虚函数表相关代码
4) 类从虚基类继承时,要确定访问虚基类的偏移量。
值得注意的是,在合成的缺省构造函数中,基本类型的成员变量包括数组成员变量,都不会被初始化。如果仅定义了一个Template构造函数,编译器还是会合成一个缺省构造函数。
有三种情况会用到Copy构造,分别是:
1) 显式初始化操作,又可分为三种语法形式(假设已经定义了X x0):
1.1 X x1(x0);
1.2 X x2 = x0; // 这是Copy构造,不是赋值
1.3 X x3 = X(x0);
2) 参数对象,即对象以传值方式作为函数参数
3) 函数返回值,即函数返回一个对象。
按C++标准,只有有价值(nontrivial)的copy构造才会被合成,确定构造函数是否有价值的标准是:是否展现“bitwise copy”。以下四种情况无法使用bitwise copy:
1) 至少有一个成员对象声明了copy构造,无论是设计者声明的,还是编译器自动合成的
2) 至少有一个基类声明了copy构造
3) 类中声明了至少一个虚函数
4) 类派生自至少一个虚基类。
赋值操作与copy构造类似,不再详述。析构函数再后面的条款中有叙述,也不再详述。
[1] 参见《C++对象模型》2.1和2.2节。