2

我在初始化列表中遇到过以下几次,但我一直无法很好地解释它。任何人都可以解释为什么以下失败(我没有编译器来捕捉拼写错误,所以请耐心等待):

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;


};

当试图调用在初始化器列表中初始化更高的成员的成员函数时,我得到了段错误。我似乎记得这是一个已知问题(或者可能是设计使然),但我从未见过它被很好地描述过。附加的示例是用普通的旧数据类型设计的,但是Bar::m_myInt用另一个缺少默认(空)构造函数的对象替换,问题就更真实了。任何人都可以启发我吗?

4

2 回答 2

9

初始化的顺序与初始化列表中元素的顺序无关。实际顺序是类定义中成员的顺序。也就是说,在您的示例m_foo中将被初始化之前m_myInt不是因为初始化列表,而是因为该成员首先出现在类中。

您发布的具体示例应该可以毫无问题地编译和运行。

于 2010-05-04T20:31:08.297 回答
3

数据成员按照类声明中列出的顺序(private:在您的示例中的顺序)进行初始化。初始化列表中给出的顺序对构造顺序没有限制。

因此,在您的示例中,像这样重新排序数据成员可能会导致未定义的行为:

private:
    int m_myInt;
    Foo m_foo;

数据成员的顺序是否可能与您显示的实际不同?

于 2010-05-04T20:34:02.970 回答