c++ 初始化参数列表顺序
简单的一个类
class A
{
int j, i;
public:
A(int x) : i(x), j(i) {}
}
如果如下定义
A a(10);
i,j的值分别是多少呢,都是10吗,实际上 i == 10, j 是一个随机数。为什么呢?难道不是从左到右初始化吗?修改如下
A(int) : i(j), j(x) {}
结果果然都是10了。难道是从右到左?再次修改
int i, j;
结果 j == 10, i 是一个随机数。迷惑了?或者你猜到了,初始化的顺序与初始化列表的顺序无关,而是类中声明的顺序。被骗了吧。
为什么是这样子呢,找了一下原因。析构的时候,与初始化相反的顺序进行,如果按初始化列表的顺序初始化,就要额外维护初始化列表的顺序,所以干脆都按声明的顺序来。
初始化列表不可缺少的原因,引用和常量必须在初始化列表里初始化。
初始化列表的优势直接构造不用赋值性能优势。
总结:不要被初始化列表的顺序迷惑,按声明的顺序初始化,最好按声明的顺序写初始化列表。