1. C++11列表初始化:更简洁的变量初始化方式
列表初始化(List Initialization)是C++11引入的一种全新的初始化语法,它使用花括号{}来初始化变量。这种语法不仅更加统一,还能避免一些传统初始化方式可能带来的问题。
1.1 基本语法与优势
列表初始化的基本形式如下:
cpp复制int x{5}; // 直接列表初始化
int y = {10}; // 拷贝列表初始化
std::vector<int> v{1, 2, 3}; // 容器初始化
相比传统初始化方式,列表初始化有以下优势:
- 防止窄化转换(narrowing conversion)
cpp复制int a = 3.14; // 传统方式允许,但会丢失精度
int b{3.14}; // 编译错误,防止精度丢失
- 统一的初始化语法
cpp复制struct Point {
int x, y;
};
Point p1 = {1, 2}; // 聚合初始化
Point p2{3, 4}; // 同样适用
- 避免最令人烦恼的解析(Most Vexing Parse)
cpp复制std::vector<int> v1(10); // 包含10个0的vector
std::vector<int> v2{10}; // 包含一个元素10的vector
1.2 初始化列表的工作原理
当使用列表初始化时,编译器会按照以下顺序查找匹配的构造函数:
- 首先查找接受std::initializer_list参数的构造函数
- 如果没有找到,则查找其他匹配的构造函数
例如:
cpp复制class Widget {
public:
Widget(int i, bool b); // 构造函数1
Widget(int i, double d); // 构造函数2
Widget(std::initializer_list<std::string> il); // 构造函数3
};
Widget w1(10, true); // 调用构造函数1
Widget w2{10, true}; // 也调用构造函数1
Widget w3
