参考于C++ Primer P259
前言
对于成员变量的初始化顺序来说,初始值列表和构造函数存在一定的差异。
一、初始值列表(会存在错误)
当执行如下代码时,看上去仿佛是先用val初始化了 j ,然后再用初始化后 j 的值初始化了 i ,但实际上并非如此
class a {
private :
int i, j;
public :
a(int val) : j(val), i(j) {};
void print() {
cout << "i " << i << endl;
cout << "j " << j << endl;
}
};
int main() {
a test(2);
test.print();
return 0;
}
它的输出结果为
因为它的执行顺序是, i 先被初始化,然后j被 val 初始化,因此这个初始值为未定义的 j 初始化了 i 。
初始值列表成员的初始化顺序与他们在类中定义中的出先顺序一致,第一个成员先被初始化,然后第二个…构造函数初始值列表中值的前后位置关系不会影响实际的初始化顺序。
二、构造函数
代码如下:
class a {
private :
int i, j;
public :
//a(int val) : j(val), i(j) {};
a (int val) {
j = val;
i = j;
}
void print() {
cout << "i " << i << endl;
cout << "j " << j << endl;
}
};
int main() {
a test(2);
test.print();
return 0;
}
执行效果如下
构造函数可以正常执行初始化操作
总结
构造函数初始化列表中出值的前后位置关系不会影响实际的初始化顺序。