先来看下面的代码
#include<iostream>
using namespace std;
class X
{
public:
int a;
int b;
int c;
X(int val);
};
X::X(int val):a(val), c(val), b(val)//使用列表初始化三个成员
{
cout << "初始化完成!" << endl;
}
在上面的代码中,列表初始化的顺序好像并不会影响程序的执行,但接下来的代码还能正确的输出结果吗?
#include<iostream>
using namespace std;
class X
{
public:
int a;
int b;
int c;
X(int val);
};
X::X(int val):a(val), c(val), b(c)//其实在这个地方程序就已经发生错误,但有的编译器并不会告诉你
{
cout << "初始化完成!" << endl;
cout <<'a'<< a << endl;
cout <<'b'<< b << endl;
cout <<'c'<< c << endl;
}
初始化完成!
a=val
b=-858993460(编译器随机给出的一个地址)
c=val
以上是程序输出的结果,其实原因就是构造函数列表初始化时的顺序是按照类中定义成员时的顺序进行成员初始化
解析初始化的过程:X::X(int val):a(val),c(val),b(c) 这里a被初始化为val,但是接下来进行初始化的不是c而是先对b进行初始化,但是c现在并没有被初始化,所以b赋值完的内容就是一个不存在的值