2010-02-11 124 views
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构造被调用,导致未定义的行为。强制某种初始化顺序的一种方法是在构造函数体中使成员指针和初始化它们,从而强制正确的顺序,但由于多种原因,这很丑陋。有什么办法强制使用构造函数的初始化列表的某个初始化顺序?如果没有,你有任何其他建议如何处理这个问题。

回答

12

由于初始化顺序没有定义

相反,它是明确的。初始化的顺序等于成员变量在你的类中被声明的顺序(并且不管初始化列表的实际顺序如何!因此,让初始化列表顺序与声明的顺序相匹配是一个好主意避免讨厌的惊喜)。

+0

好吧,我以为不然。感谢你及时的答复! – 2010-02-11 10:27:42

+1

我想补充一点,这是非常脆弱的,因为您对订购的依赖可能对读者而言并不明显。因此,至少我会为m_objectB的定义添加注释,以便“必须在m_objectA之后定义”的效果。 – peterchen 2010-02-11 10:28:51

+0

@peterchen:这就是为什么初始化列表的顺序应该与声明顺序真正匹配的原因。 – 2010-02-11 10:29:57