深入理解初始化列表
-
概念
- 初始化列表用于构造函数之中,旨在于优化构造函数,提高代码可读性。
- 初始化列表就是成员变量定义的地方。
-
初始化列表形式
- 以 冒号(
:
)开始, 逗号(,
) 分割
- 以 冒号(
-
初始化列表基本用法
- 初始化列表定义
- 语法结构
class Date { public: Date(int year, int month, int day) :_year(year) ,_month(month) ,_day(day) {} private: int _year; int _month; int _day; };
-
使用初始化列表的好处
- 提高性能,减少不必要的默认构造和赋值操作
- 直接初始化成员变量
- 支持常量成员和引用成员的初始化
- 必须用初始化列表初始化的成员
- 常量成员变量(用const修饰的变量)
- 因为不能改变其值,所以必须在定义时初始化
- 类型为引用的变量
- 引用的对象一旦确定不可改变,所以只能在定义时初始化
- 没有默认构造函数的自定义类型
- 没有构造函数意味着得不到初始化,所以必须在初始化列表初始化
- 常量成员变量(用const修饰的变量)
- 必须用初始化列表初始化的成员
class A
{
public:
A(int n)
:_mon(n)
,_goo(n)
,_d(n)
{}
private:
const int _goo;
int& _mon;
int _d;
};
int main()
{
A a1(10);
return 0;
}
-
初始化列表的拓展用法
- 动态内存分配
- 类型转换赋值 & explicit关键字
// 初始化列表的动态内存分配 class A { public: A(int n) :a = new int[10] {} ~A() { delete[] A; } private: int* a(10); };
explicit
- 修饰构造函数:防止单参数构造函数被用于隐式转换。
- 修饰转换运算符:防止类型转换函数被用于隐式转换。
class A
{
public:
// 这是一个被explicit修饰的构造函数,它的内部将无法进行隐式类型转换
explicit A(int n)
:a = new int[n]
{}
private:
int *a;
};