初始化列表和声明顺序之间的关系
初始化列表和声明的顺序之间的关系
类中数据成员的声明顺序和初始化顺序之间的关系?
在类中的声明顺序是不是一定和初始化顺序相一致,不一致会出现什么结果,为什么要一致?
类的数据成员的初始化顺序是按照类内数据成员的声明顺序进行初始化的,这样就可以减少不必要的开销,这样的话类就不必要为每一个对象进行跟踪初始化数据成员,只需要按照类中的声明顺序进行初始化就可以了。
如果允许上面的情况(即,成员按它们在初始化列表上出现的顺序被初始化)发生,编译器就要为每一个对象跟踪其成员初始化的顺序,以保证它们的析构函数以正确的顺序被调用。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在初始化列表中的顺序如何。
另外,基类数据成员总是在派生类数据成员之前被初始化,所以使用继承时,要把基类的初始化列在成员初始化列表的最前面。
看下面的例子:
这段代码中的初始化列表为:: size(highbound - lowbound + 1),lbound(lowbound), hbound(highbound),data(size)
声明的顺序为:vector<t> data; // 数组数据存储在vector对象中
size_t size; // 数组中元素的数量
int lbound, hbound; // 下限,上限
编辑器会按照声明顺序进行初始化,那么首先初始化vector<t> data; 由于vector<t> data; 的初始化是data(size),而size有没有被初始化,所以这段代码是有隐患的。
所以声明时应该这样声明:
size_t size; // 数组中元素的数量
int lbound, hbound; // 下限,上限
vector<t> data; // 数组数据存储在vector对象中
记住:初始化列表中成员列出的顺序和成员在类内声明的顺序一致。