构造函数与初始化列表
构造函数的执行分为两步:成员初始化和一般计算(即构造函数体的语句)。
对于类中的数据成员不放在初始化列表中,则会在执行构造函数体之前默认初始化;在初始化列表中的成员则在初始化列表中初始化,然后在执行函数体(第二步即一般计算)。因此在初始化列表中是初始化,即直接调用成员的构造函数构造成员;而在构造函数体内则是赋值,即覆盖之前默认的初始化值。这对于比较复杂的数据类型有着效率的差别。
对于派生类的构造函数:
class derive:public base {
derive(type1 x,type2 y…..) :base(x..) ,derive_mem(y)//初始化列表
};
在派生类的初始化列表中,先把参数上传给相邻基类构造函数,后面依次初始化派生类新成员。注意派生类构造函数的执行过程:先初始化(即执行初始化列表和其他成员的默认初始化,然后执行函数体,在派生类构造函数体的开端调用基类的构造函数,然后才正真执行派生类的构造函数体)。因此以初始化方法是错误的:
derive(type1 x,type2 y…..) :base_mem(x..) , derive_mem(y)//直接把参数传递给基类成员,而不是基类的构造函数。因为在执行初始化列表的时候还没有构造出基类(除非在此显示的调用基类构造函数)以及派生类,因此派生类中还没有基类的数据成员。
//初始化列表只能出现在构造函数定义处,而不是声明