正如已经回答的那样,初始化列表在进入构造函数块之前完全执行。所以在构造函数体中使用(初始化的)成员是完全安全的。
您在接受的答案中发表了关于必须引用构造函数参数而不是构造函数块内的成员变量的评论。你没有。
您可能误认为您应该引用参数而不是初始化列表中的成员属性。例如,给定一个具有两个 int 类型成员(a_ 和 b_)的类 X,以下构造函数可能定义不正确:
X::X( int a ) : a_( a ), b( a_*2 ) {}
这里可能的问题是初始化列表中元素的构造取决于类中声明的顺序,而不是您键入初始化列表的顺序。如果类被定义为:
class X
{
public:
X( int a );
private:
int b_;
int a_;
};
然后,无论您如何键入初始化列表,事实是 b_( a_*2 ) 将在 a_ 初始化之前执行,因为成员的声明首先是 b_,然后是 a_。这将产生一个错误,因为您的代码认为(并且可能取决于)b_ 是 a_ 值的两倍,实际上 b_ 包含垃圾。最简单的解决方案是不引用成员:
X::X( int a ) : a_( a ), b( a*2 ) {} // correct regardless of how X is declared
避免这个陷阱是建议您不要将成员属性用作其他成员初始化的一部分的原因。