初始化列表执行顺序
时间:2010-09-18 来源:zyd_cu
初始化列表中成员初始化执行的顺序与它们在类中声明的顺序相同,而与其出现在列表中的顺序无关,如如下例,SubArray能从一个数组的一部分构造对象,在其构造的过程中,size、lBound、hBound、data先后出现在初始化列表中,看似没什么问题,但实际上vector数组的长度是不确定的,因为编译器并不是先初始化size,再构造size长度的vector,而会根据vector先在类中声明而先构造vector对象,而此时的size值是不确定。
#include <iostream> |
为什么需要做这样的规定呢,因为C++中规定了对象的被析构的顺序与其被构造的顺序相反,假设允许按照在初始化列表中的顺序初始化,如下例:
class TwoString { |
根据我们的假设,创建w1时,s1先于s2被创建;创建w2时,s2先于s1被创建。为了保证对象的被析构的顺序与其被构造的顺序相反这一原则,编译器必须跟踪每个对象的成员初始化顺序。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在初始化列表中的顺序如何。