初始化顺序严格按类内声明顺序,与初始化列表顺序无关;b(a+1)仅当a先声明时安全,否则读取未初始化变量导致未定义行为。

可以,但必须满足两个前提:被引用的变量在初始化顺序中已经完成初始化,且该变量本身是已定义、可访问的左值。
初始化列表中用另一个成员变量是否安全?
不安全——除非它在类中声明顺序靠前。C++严格按成员变量在类内声明的顺序初始化,和初始化列表里写的先后无关。
-
a在类中先声明,b后声明 →b(a + 1)是安全的 -
b在类中先声明,a后声明 → 即使初始化列表写成a(5), b(a + 1),b仍会先初始化,此时a还未构造,读取a是未定义行为 - 编译器通常不会报错,但运行结果不可预测(比如输出随机值或崩溃)
构造函数体内赋值时用另一个变量行不行?
可以,但要注意语义差异:这是“赋值”而非“初始化”。对 const、引用、无默认构造的类成员,这根本不可行。
-
const int x = 10;→ 只能在初始化列表中写x(10),不能在构造函数体里写x = 10; -
int& ref;→ 必须在初始化列表绑定到一个已存在的对象,构造函数体内无法“重新绑定” -
Time t;(Time没有默认构造)→ 必须写t(12)在初始化列表,否则编译失败
C++11成员缺省值能否依赖其他成员?
不能。成员变量声明处的缺省值(如 int x = 42;)是独立求值的,不能引用 this 或其他成员。
- 下面写法非法:
int size_ = 10; int capacity_ = size_ + 2;→ 编译错误 - 缺省值只能是常量表达式、字面量、或调用 constexpr 函数(且不能访问
this) - 若需依赖关系,必须移到初始化列表,或封装进辅助函数(如
calculateCapacity())
最易被忽略的一点:初始化顺序陷阱往往在调试时才暴露,且不触发编译警告。建议把成员变量声明顺序、初始化列表顺序、逻辑依赖三者对齐,再打开 -Wreorder 编译选项让编译器帮你检查。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











