【问题标题】:Initializing members with members用成员初始化成员
【发布时间】:2010-02-11 10:24:48
【问题描述】:

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

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

【问题讨论】:

    标签: c++ constructor ctor-initializer c++-faq


    【解决方案1】:

    由于没有定义初始化顺序

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

    【讨论】:

    • 好吧,我不这么认为。感谢您的快速回答!
    • 我要补充一点,这很脆弱,因为您对订购的依赖可能对读者来说并不明显。所以至少我会在 m_objectB 的定义中添加一个注释,大意是“必须在 m_objectA 之后定义”。
    • @peterchen:这就是为什么初始化列表的顺序应该与声明顺序真正匹配的原因。
    • 我还会添加适当的编译器选项来警告您。在 g++ 中,'-Wreorder' 强制用户提供的初始化列表顺序与成员属性的定义顺序相匹配。
    • @David - 非常有用。有人知道MS编译器是否有类似的东西吗?
    猜你喜欢
    • 2011-07-14
    • 2019-09-10
    • 1970-01-01
    • 2015-10-09
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多