说明
C++类成员初始化顺序取决于其声明顺序,而非初始化列表的顺序。
测试代码
/**
* 测试类成员的初始化顺序
* @file init_oder.cpp
*/
#include <iostream>
class Test {
public:
Test() : mBb(sIndex++), mAa(sIndex++) { }
public:
void Dump() {
std::cout<< "a: " << mAa << ", b: " << mBb << std::endl;
}
protected:
int mAa;
int mBb;
static int sIndex;
};
int Test::sIndex = 1;
int main() {
Test t;
t.Dump();
return 0;
}
运行及结果
$ g++ init_order.cpp
$ ./a.out
a: 1, b: 2
风险分析
当类的成员初始化有依赖关系(如某个成员的构造函数的参数是另一个成员)时,较容易出错。这是因为程序员的意图(初始化列表顺序)和程序的行为(成员声明 顺序)是分离的,前者一般位于实现文件,后者位于头文件,编辑前者往往忽略后者。因此少用有依赖的初始化设计,并且在review中加入该检查条目。