成员初始化列表的语法:
如果Classy是一个类,而mem1、mem2和mem3都是这个类的数据成员,则类构造函数可以使用如下的语法来初始化数据成员:
Classy::Classy(int n, int m) :mem1(n), mem2(0), mem3(n * m + 2)
{
//...
}
上述代码将mem1初始化为n,将mem2初始化为0,将mem3初始化为n*m+2。从概念上说,这些初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。请注意以下几点:
- 这种格式只能用于构造函数
- 必须用这种格式来初始化非静态const数据成员
- 必须用这种格式来初始化引用数据成员
数据成员被初始化的顺序与它们出现在类声明中的顺序相同,与初始化器中的排列顺序无关。
观察下面这段代码的输出:
#include <iostream>
using namespace std;
class A
{
private:
int n1;
int n2;
public:
A():n2(0),n1(n2+2)
{
}
void Print()
{
std::cout << "n1: " << n1 << ",n2: " << n2 << std::endl;
}
};
int main()
{
A a;
a.Print();
return 0;
}
运行结果:
n1: 54,n2: 0
分析:
n1先于n2被声明,因此n1也会在n2之前被初始化,所以会先用n2+2去初始化n1。由于n2这个时候还没有被初始化,因此它的值是随机的。用此时的n2加上2去初始化n1,n1的值只是一个随机值。接下来再用0初始化n2,因此最终n2的值是0.