成员初始化列表
在 C++ 中,成员初始化列表(Member Initializer List) 用于在构造函数中初始化类的成员变量或基类,比在构造函数体内赋值更高效(尤其是对 const
成员、引用成员和类类型成员)。下面通过几个例子详细说明其用法和优势。
1. 基本语法
1 | ClassName(参数列表) 成员1(初始值), 成员2(初始值), ..., 基类(参数) { |
- 初始化顺序:基类 → 成员变量(按声明顺序,而非初始化列表顺序)→ 构造函数体。
2. 典型使用场景
(1) 初始化基类
1 |
|
关键点:
- 如果基类没有默认构造函数(如
Animal
必须传name
),子类必须通过初始化列表调用基类构造。
(2) 初始化 const
成员或引用成员
1 | class Example { |
为什么不能用构造函数体赋值?
const
和引用成员必须在创建时初始化,不能在构造函数体内修改。
(3) 初始化类类型成员(避免默认构造 + 拷贝赋值)
1 |
|
对比低效写法:1
2
3
4
5 低效版本:先默认构造 name_,再赋值
Person(const stdstring& name, int age) {
name_ = name; 调用了默认构造 + operator=
age_ = age;
}
(4) 初始化数组成员(C++11 起支持)
1 | class ArrayWrapper { |
3. 必须使用初始化列表的情况
以下成员必须通过初始化列表初始化:
const
成员1
2
3
4
5
6class ConstExample {
public
ConstExample(int val) const_val_(val) {}
private
const int const_val_; 必须初始化列表赋值
};引用成员
1
2
3
4
5
6class RefExample {
public
RefExample(int& ref) ref_(ref) {}
private
int& ref_; 必须初始化列表绑定
};没有默认构造函数的类成员
1
2
3
4
5
6
7
8
9
10
11class NoDefault {
public
NoDefault(int x) {} 没有默认构造函数
};
class Container {
public
Container() member_(42) {} 必须初始化列表
private
NoDefault member_;
};基类没有默认构造函数
1
2
3
4
5
6
7
8
9class Base {
public
Base(int x) {} 没有默认构造函数
};
class Derived public Base {
public
Derived() Base(42) {} 必须初始化列表
};
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小何的图书室!
评论