如果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。从概念上说,这些初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。
-
案例
类A的成员如下:Class A { private: int item; const int asize; ... public: ... }
未使用成员初始化列表的构造函数如下:
A::A(int s) { item = 0; asize = s; // 不被允许 }
asize是常量,因此可以对它初始化,但不能赋值。从概念上说,调用构造函数时,对象将在括号中的代码执行之前被创建。因此,调用A(int s)构造函数将导致程序首先给2个成员变量分配内存。然后,程序流程进入到括号中,使用常规的赋值方式将值存储到内存中。因此,对于const数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化。
因此,需要采用成员初始化列表的构造函数:
A::A(int s) : item(0), asize(s) {}
-
注意
① 这种格式只能用于构造函数;
② 必须用这种格式来初始化非静态const 数据成员;
③ 必须用这种格式来初始化引用数据成员。
评论区