C++ 类和对象进阶:初始化列表、static 成员与编译器优化
一、再探构造函数:初始化列表
在构造函数体内给成员变量赋值,严格来说这只能叫函数体内赋初值。对象实例化时,内存分配后成员变量已经存在。进入构造函数 {} 内部是对已存在变量的二次赋值。
遇到以下三种成员变量时,必须在定义瞬间初始化,否则编译报错:
- const 成员变量:常量一旦定义,值锁定。
- 引用成员变量:引用定义时必须绑定实体。
- 无默认构造函数的自定义类型成员:必须显式指定构造方式。
1. 语法格式
以冒号开始,逗号分隔的成员列表,每个成员后跟初始值或表达式。
class A {
public:
// 初始化列表才是成员变量真正定义(出生)的地方!
A(int a, int ref) : _a1(a), _n(10), _ref(ref) {}
private:
int _a1;
const int _n; // 必须走列表
int& _ref; // 必须走列表
};
2. 规则与注意事项
- 唯一性:每个成员变量在初始化列表中只能出现一次。
- 强制初始化:引用、const、无默认构造函数的自定义类型必须在初始化列表中完成。
- 执行顺序:仅由成员变量在类中的声明顺序决定,与初始化列表书写顺序无关。建议保持声明顺序与列表顺序一致。
- C++11 缺省值:支持在成员声明处设置缺省值,供未在初始化列表中显式初始化的成员使用。
3. 初始化顺序陷阱
class A {
public:
A(int a) : _a1(a), _a2(_a1) {} // 踩坑点
void Print() { cout << _a1 << " " << _a2 << endl; }
private:
int _a2; // 先声明
_a1;
};
{
;
obj.();
;
}


