4

这是我经常遇到的问题。以下示例说明了这一点:

struct A {
    int m_SomeNumber;
};

struct B {
    B( A & RequiredObject );
private:
    A & m_RequiredObject;
};

struct C {
    C( );
private:
    A m_ObjectA;
    B m_ObjectB;
};

的构造函数的实现C看起来像这样:

C::C( )
 : B( m_ObjectA )
{ }

由于未定义初始化顺序,m_ObjectA可能在m_ObjectB调用构造函数时未初始化,导致未定义行为。强制某种初始化顺序的一种方法是使成员指针并在构造函数主体中初始化它们,从而强制执行正确的顺序,但这很丑陋,有几个原因。有没有办法使用构造函数的初始化列表强制某个初始化顺序?如果没有,您有任何其他建议如何处理这个问题。

4

1 回答 1

12

由于未定义初始化顺序

相反,它是明确定义的。初始化的顺序等于在你的类中声明成员变量的顺序(这与初始化列表的实际顺序无关!因此,让初始化列表的顺序与声明的顺序相匹配是一个好主意避免令人讨厌的意外)。

于 2010-02-11T10:25:57.000 回答