C++ initialization list

1. 初始化列表

初始化列表是 C++ 的一种构造对象的方式,它是在构造函数中给对象赋值的一种方式。

2. 初始化列表的语法

初始化列表的语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class 类名
{
类成员变量1;类成员变量2 ;
...
类成员变量n;
类成员函数1;
类成员函数2;
...
类成员函数n;
构造函数(参数列表): 初始化列表
{

}
};

3. 初始化列表注意事项

在初始化列表中成员变量的初始化顺序并不影响最终成员变量的初始化顺序,而是按照成员变量在类中的声明顺序进行初始化。一般情况下,如果在初始化列表中没有按照成员变量的声明顺序来初始化,也没有问题,但某些情况下可能导致对象并没有真正地被初始化。如下所示:

1
2
3
4
5
6
7
8
9
10
class X {
int i;
int j;
public:
// oops! do you see the problem?
X( int val )
: j( val ), i( j )
{} ...
};

按照上面的初始化列表,程序实际运行的时候,先初始化i, 再初始化j, 最后才调用构造函数。在初始化i的时候,j还没有被初始化,所以i的值是未定义的。

4. 带初始化列表的构造函数的写法建议

I recommend always placing the initialization of one member with another (if you really feel it is necessary) within the body of the constructor, as follows: –from 《Inside the c++ object model》

1
2
3
4
// preferred idiom
X::X( int val ): j( val ) {
i = j;
}

如果需要调用成员函数来初始化某个成员的话,最好将该初始化函数放在构造函数里面,以确保成员函数可能依赖的对象状态在此时已经是被初始化好了的。