构造函数成员初始化列表

在C++中,构造函数成员初始化列表是一种在构造函数体执行之前初始化类成员变量的机制。这不仅能提高效率,还是初始化具有非默认构造函数的类成员、常量成员、引用成员和没有默认构造函数的基类的唯一方法。

构造函数成员初始化列表位于构造函数参数列表之后,函数体之前,以冒号开始,后面跟着一个或多个用逗号分隔的初始化器。每个初始化器都有一个成员变量名字和相应的初始化表达式,这个表达式可以是任意复杂度的。

下面是构造函数成员初始化列表的一个示例:

1
2
3
4
5
6
7
8
9
10
11
class MyClass {
public:
MyClass(int x, double y) : id(x), value(y) {
// 构造函数体
}

private:
const int id; // 常量成员,必须在成员初始化列表中初始化
double value; // 普通成员,可以在成员初始化列表中初始化
};

在上面的例子中,MyClass有两个成员变量:idvalue。因为id是一个常量成员,所以必须在成员初始化列表中初始化。对于value,在成员初始化列表中初始化是一个更高效的选择,因为它避免了在构造函数体内对value进行额外的赋值操作。

成员初始化列表执行顺序与成员在类中声明的顺序相同,而不是它们在初始化列表中出现的顺序。因此,即使初始化列表中的顺序不同,成员的初始化顺序仍然是固定的。这一点在成员之间有依赖关系时尤其重要。

成员初始化列表也被用于基于委托的构造函数(delegate constructors),这是C++11中新增的特性,允许一个构造函数调用类中的另一个构造函数来初始化对象。

1
2
3
4
5
6
7
8
9
10
11
12
class MyClass {
public:
MyClass() : MyClass(0, 0.0) {} // 委托给另一个构造函数

MyClass(int x, double y) : id(x), value(y) {
// 构造函数体
}

private:
int id;
double value;
};

在这个例子中,无参构造函数委托给有参构造函数进行初始化。

总之,构造函数成员初始化列表是C++中初始化类成员的推荐方法,特别是对于那些不能在类体内或构造函数体内被赋值的成员。