构造函数初始化列表仅用于初始化成员的值,并不指定这些初始化执行的次序。成员被初始化的次序就是定义成员的次序。第一个被定义的成员先被初始化,依次类推。通常,初始化的顺序可有可无,然而,若是一个成员是根据其余成员而初始化,则成员的初始化顺序是相当重要的。html
class x {函数
int i;//声明顺序是先i,后j,故初始化列表中,会先初始化i,在初始化jspa
int j;htm
public:对象
x(int tem): j(tem),i(j){} //看起来是先初始化j,而后初始化i,其实偏偏相反,先用未初始化的j来初始化i,虽然编译器不会提示你什么,可是j未初始化它便由计算机随即分配的内存存储,它的值也是随即的,这个值可能不是你想要的,错误就出现了。将i和j的声明顺序调过来就没有问题了。blog
};内存
总的来讲,有虚基类时,初始化列表调用构造函数初始化的顺序以下:编译器
1)虚基类的构造函数编译
2)根据派生类声明的顺序调用派生类的构造函数,对虚基类构造函数的调用被忽略class
3)根据派生类对象声明的顺序调用对象所属派生类的虚基类构造函数、对象所属派生类的构造函数
无虚基类时,初始化列表调用构造函数初始化的顺序以下:
1)根据派生类声明的顺序调用对象所属派生类的基类构造函数、接着是派生类的构造函数
2)根据派生类对象声明的顺序调用对象所属派生类的基类构造函数、对象所属派生类的构造函数
转自:http://blog.sina.com.cn/s/blog_508938e10102v1es.html