我使用初始化列表遇到了以下几次,我从来没有能够很好地解释它。任何人都可以解释为什么以下失败(我没有编译器来捕捉拼写错误,所以请耐心等待):
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;
};
当尝试调用初始化列表初始化的成员的成员函数时,我得到seg错误。我似乎记得这是一个已知的问题(或者可能以某种方式设计),但我从未见过它。附加的示例是使用普通的旧数据类型设计的,但是将Bar::m_myInt
替换为缺少默认(空)构造函数的另一个对象,问题更加真实。谁能开导我?
答案 0 :(得分:9)
初始化顺序与初始化列表中元素的顺序无关。实际的顺序是类定义中成员的顺序。也就是说,在您的示例中,m_foo
将在m_myInt
之前初始化,而不是因为初始化列表,而是因为该成员首先出现在类中。
您发布的具体示例应该编译并运行没有问题。
答案 1 :(得分:3)
数据成员按照类声明中列出的顺序进行初始化(示例中的private:
下的顺序)。初始化程序列表中给出的顺序没有限制施工顺序。
因此,在您的示例中,重新排序数据成员会导致未定义的行为:
private:
int m_myInt;
Foo m_foo;
数据成员的顺序是否可能与您显示的实际不同?