Using member functions of members in the constructor initializer
我在初始化列表中遇到过几次以下问题,但我一直无法很好地解释它。任何人都可以解释为什么以下失败(我没有编译器来捕捉拼写错误,所以请耐心等待):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Foo { public: Foo( int i ) : m_i( i ) {} //works with no problem int getInt() {return m_i;} ~Foo() {} private: int m_i; }; class Bar { public: Bar() : m_foo( 5 ), //this is ok m_myInt( m_foo.getInt() ) //runtime error, seg 11 {} ~Bar() {} private: Foo m_foo; int m_myInt; }; |
当试图调用在初始化器列表中较高级初始化的成员的成员函数时,我会遇到段错误。我似乎记得这是一个已知问题(或者可能是设计使然),但我从未见过它被很好地描述过。附加的示例是用普通的旧数据类型设计的,但是将
初始化顺序与初始化列表中元素的顺序无关。实际顺序是类定义中成员的顺序。也就是说,在您的示例中,
您发布的具体示例应该可以毫无问题地编译和运行。
数据成员按照类声明中列出的顺序进行初始化(在您的示例中为
因此,在您的示例中,像这样重新排序数据成员可能会导致未定义的行为:
1 2 3 | private: int m_myInt; Foo m_foo; |
数据成员的顺序是否可能与您显示的实际不同?