在构造函数初始值设定项列表中使用成员

Use member in constructor initializer list

本文关键字:列表 成员 构造函数      更新时间:2024-09-22

我可以安全地使用成员初始化其他成员吗?

class Class {
public:
Class(X argument) : memberA(argument), memberB(memberA) {}
A memberA;
B memberB;
};

在这里,我们使用构造函数的参数来初始化memberA。然后,我们依赖于这样一个事实,即这发生在memberB的初始化之前,并使用memberA初始化memberB

如果我们假设XABstd::string,那么只要我们不更改成员声明的顺序,上面的示例就可以工作(用gcc测试(。但这实际上是由标准保证的吗?还是我滥用了编译器的实现细节?

是的,根据class.base.init#15 ,这是安全的

mem初始值设定项的表达式列表或braked init列表在构造函数的函数参数范围内,可以使用它来引用正在初始化的对象。

本注释还有一个this->i的示例,显示以前初始化的类成员可以用于初始化mem初始化器中的其他类成员。(在本例中,this->仅用于消除成员和构造函数参数(均命名为i(的歧义。

请注意,在使用该成员之前,该成员已经初始化,因为它来自class.base.init#13.3

。。。非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样,与mem初始化器的顺序无关(。