【发布时间】:2020-05-25 02:36:05
【问题描述】:
如果使用大括号或相等初始化器,成员变量的初始化顺序是什么?它们的初始化和代码顺序一样吗?
struct foo {
int x = 1;
int y = x + 1;
} bar;
无论编译器如何,bar.y 是否总是2?
【问题讨论】:
标签: c++ initialization c++14
如果使用大括号或相等初始化器,成员变量的初始化顺序是什么?它们的初始化和代码顺序一样吗?
struct foo {
int x = 1;
int y = x + 1;
} bar;
无论编译器如何,bar.y 是否总是2?
【问题讨论】:
标签: c++ initialization c++14
是的,y 保证在x 之后被初始化。非静态数据成员在类定义中始终为initialized in order of their declaration,无论它们是如何初始化的(通过member initializer list 或default member initializer,甚至default initialization)。
3) 然后,非静态数据成员按顺序初始化 类定义中的声明。
【讨论】:
来自 Scott Meyers 的书,Effective C++,第 4 项:
C++ 的一个不变的方面是对象的顺序 数据被初始化。这个顺序总是一样的:基类是 在派生类之前初始化(另见条款 12),并且在一个 类中,数据成员按它们的顺序进行初始化 声明。
【讨论】: