类成员初始化顺序,C++

Edu*_*yan 1 c++ constructor initialization class

所有旧的和现代的C++书籍和专家都声明按照声明顺序初始化类成员.但是,如果我不这样做,也没有解释?我不是在谈论具有const类型或smth成员的类.只是简单的简单类.

考虑样本:

class A
{
  int n;
  std::vector<double> VD;
  char c;
public:
  A():
      VD(std::vector<double>(3)),
      c('a'),
      n(44)
      {
      }
};
Run Code Online (Sandbox Code Playgroud)

什么是书面代码与具有相同顺序的代码的区别?

Sto*_*ica 7

什么是书面代码与具有相同顺序的代码的区别?

如果成员不依赖于彼此的初始化顺序,则没有任何区别.但如果他们这样做,那么成员初始化列表可能会说谎.

当他们认为他们的构造函数被正确编写时,许多程序员被这个咬了,但实际上他们手上有不确定的行为.

考虑这个简单的情况:

struct foo {
  int _a;
  int _b;
  foo(int b) : _b(b), _a(2 * _b) {}
};
Run Code Online (Sandbox Code Playgroud)

什么是_a在上面的例子?如果您回答"行为未定义因为_b已初始化",那么您就错了.


das*_*ght 6

但是如果我不这样做,也没有解释什么?

程序员无法控制它:在初始化列表中列出成员的顺序对初始化的实际顺序没有影响.编译器忽略列表中项目的顺序,并重新排序表达式以匹配声明顺序.

这是一个简短的例子来说明这一点:

struct Foo {
    Foo(const char *s) { cout << "Init " << s << endl; }
};
struct Bar {
    Foo a;
    Foo b;
    Foo c;
    Bar() : c("c"), b("b"), a("a") {
    }
};
Run Code Online (Sandbox Code Playgroud)

以上打印

Init a
Init b
Init c
Run Code Online (Sandbox Code Playgroud)

即使初始化以相反的顺序列出项目.

演示.