初始化顺序: 成员变量声明时初始化-> 初始化列表初始化-> 构造函数初始化。
注意:
初始化列表初始化参数的顺序是按照成员变量声明顺序来实现的,与初始化列表顺序无关,当然构造函数内有自己的初始化顺序。
每一个成员变量都会走一遍初始化列表,如果初始化列表中未初始化,且声明时未初始化,则会初始化一个默认的随机值(也可能默认0)。
const成员变量必须在构造函数的参数初始化列表中进行初始化,C++11及以后可以在声明时初始化,但不能在构造函数里面初始化。
static成员初始化不能在类定义中,通过作用域限定符初始化
类型 类名::变量名=值;
看一个实例:
#include<iostream>
class TestA final {
public:
int a;
int b = a;
const int c = 12;
TestA(int i): a(i) {
}
};
int main () {
A at(12);
std::cout << at.b << std::endl;
return 0;
}
输出值是:
12
如果调整a和b的顺序:
#include<iostream>
class TestA final {
public:
int b = a;
int a;
const int c = 12;
TestA(int i): a(i) {
}
};
int main () {
A at(12);
std::cout << at.b << std::endl;
return 0;
}
输出值是:
0
这是因为a未初始化之前,b先初始化,所以会给一个默认值。
end