Default Constructor
需要合成default constructor的情形:
带有Default Constructor的Member Class Object
- 如果一个 class 没有任何 constructor ,但它内含一个 member object ,而后者有 default constructor,那么这个 class 的隐式 default constructor 就是有用的,编译器需要为该class合成出一个 default constructor。
如果class A内含一个或一个以上的member class object,那么class A的每一个constructor必须调用每一个member classes的default constructor。编译器会扩张已存在的constructors,在其中安插一些代码,使得 user code 被执行之前,先调用必要的 default constructors。
c++语言要求以member objects在class中的声明顺序来调用各个constructors。
- 如果一个没有任何constructors的class派生自一个带有default constructor的base class,那么这个derived class的default constructor会被视为有用的,需要被合成出来。
如果设计者提供多个constructors,但其中都没有 default constructor ,那么编译器会扩张现有的每一个 constructor ,将用以调用所有必要之default constructors的程序代码加进去。
class声明(继承)一个virtual function。
class 派生自一个继承链,其中有一个或多个virtual base classes。
Copy Constructor
如果class 没有提供一个显式的copy constructor,当class object以相同class的另一个object作为初始值时,内部以default memberwise initialization手法完成。也就是把每一个内建的或派生的data member的值,从某个object拷贝一份到另一个object上。
当 class 不展现出 bitwise copy semantics(位逐次拷贝)时,才会合成出copy constructor。
有4种情况:
1. 当class内含一个member object,而后者的class声明有一个copy constructor。
2. 当class继承自一个base class而后者存在一个copy constructor时。
3. 当class声明了一个或多个virtual functions时。
4. 当class派生自一个继承串链,其中有一个或多个virtual base classes。
成员初始化
在下列情况下,必须使用member initialization list:
1. 当初始化一个 reference member 时。
2. 当初始化一个 const member 时。
3. 当调用一个 base class 的 constructor ,而它拥有一组参数时。
4. 当调用一个member class 的constructor,而它拥有一组参数时。
class Word
{
String _name;
int _cnt;
public:
Word()
{
_name = 0;
_cnt = 0;
}
};
这种方式会先产生一个临时性的 String object,然后将它初始化,之后以一个assignment运算符将临时性object指定给_name,随后再摧毁那个临时性object。
将int型的变量_cnt放在初始化链表中没有必要,因为它已经是一个行为良好的member。
list中的项目顺序是由class中的members声明顺序决定的,不是由 initialization list决定的。