军规 保持类成员变量定义和初始化的顺序一致
Always declare and initialize member variables in the same order
解读
(1)一个例子
#include <iostream>
class Range
{
public:
Range() : min_(0), max_(min_ + 10){}
int GetMin()
{
return min_;
}
int GetMax()
{
return max_;
}
private:
int max_;
int min_;
};
int main(int argc, char *argv[])
{
Range r;
std::cout << "min_ = " << r.GetMin() << " max_ = " << r.GetMax() << std::endl;
return 0;
}
运行结果
min_ = 0 max_ = 12595198
程序期望的结果应该是min_=0 max_=10
实际的结果max_的值为一个很大的数值。这是因为编译器在初始化成员变量的时候是按照变量定义的顺序而不是按照类的初始化列表里面指定的顺序。在上述例子中,max_
在min_
之前被定义,而在初始化列表中,
max_
在min_
之后,实际上在执行max_(min + 10)
时min_
并没有被初始化。把例子中两个变量的定义顺序颠倒后,结果如下:
min_ = 0 max_ = 10
(2)最佳实践
在用类的初始化列表来初始化成员变量时一定要按照变量定义的顺序书写初始化序列。