是否在构造函数初始化程序列表执行之前初始化了成员值?

时间:2013-02-11 01:35:07

标签: c++

举个例子:

class Foo {
private:
  const std::string m_str1;
  const std::string m_str2;

  std::string foo() {
    std::cout << ("'" + m_str2 + "'") << std::endl;
    return "whatever1";
  }

public:
  Foo() : m_str1(foo()), m_str2("whatever2") { }
};

int main() {
  Foo foo;
  return 0;
}

在我的计算机上,它打印出''(两个单引号一个接一个),表明在执行构造函数列表之前,m_str2实际上已初始化为空字符串。

但总的来说这是真的吗?

2 个答案:

答案 0 :(得分:7)

正如克里斯评论的那样,Foo的构造将按顺序

  • 初始化m_str1
  • 初始化m_str2
  • 运行(空)构造函数体

您注意到在m_str1初始化期间,m_str2尚未初始化。

m_str2已将值初始化为空字符串,正如您所说。

当时访问m_str2 undefined behavior

答案 1 :(得分:4)

这是未定义的行为。调用m_str2时尚未构造foo()。它似乎有效的事实可能是巧合。