提问人:Björn Pollex 提问时间:2/11/2010 最后编辑:sbiBjörn Pollex 更新时间:12/21/2014 访问量:328
使用成员初始化成员
Initializing members with members
问:
这是我经常遇到的问题。以下示例对此进行了说明:
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赞
Konrad Rudolph
2/11/2010
#1
由于未定义初始化顺序
相反,它是明确定义的。初始化的顺序等于成员变量在类中声明的顺序(这与初始化列表的实际顺序无关!因此,最好让初始化列表顺序与声明的顺序匹配,以避免令人讨厌的意外)。
评论
0赞
Björn Pollex
2/11/2010
好吧,我不这么认为。感谢您的快速回答!
1赞
peterchen
2/11/2010
我要补充一点,这是相当脆弱的,因为你对排序的依赖对读者来说可能并不明显。因此,至少我会在m_objectB的定义中添加一条注释,大意是“必须在m_objectA之后定义”。
0赞
Konrad Rudolph
2/11/2010
@peterchen:这就是为什么初始化列表的顺序应该与声明顺序真正匹配的原因。
3赞
David Rodríguez - dribeas
2/11/2010
我还会添加适当的编译器选项来警告您。在 g++ 中,'-Wreorder' 强制用户提供的初始化列表顺序与成员属性的定义顺序相匹配。
0赞
Manuel
2/11/2010
@David - 非常有用。有谁知道 MS 编译器是否有类似的东西?
评论