在构造函数初始值设定项中使用成员的成员函数

awm*_*129 2 c++ constructor ctor-initializer

我使用初始化列表进行了以下几次尝试,但我从来没有能够很好地解释它.任何人都可以解释为什么以下失败(我没有编译器来捕捉拼写错误,所以请耐心等待):

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;


};
Run Code Online (Sandbox Code Playgroud)

当尝试调用初始化列表初始化的成员的成员函数时,我得到seg错误.我似乎记得这是一个已知的问题(或者可能以某种方式设计),但我从未见过它.附加的示例是使用普通的旧数据类型设计的,但Bar::m_myInt用另一个缺少默认(空)构造函数的对象替换,问题更加真实.任何人都可以开导我吗?

Dav*_*eas 9

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

您发布的具体示例应该编译并运行没有问题.

  • 在gcc的情况下,你可以传递它`-Wreorder`,如果你陷入困境就会发出警告 (2认同)