1. C++11列表初始化详解
1.1 传统初始化方式回顾
在C++98标准中,我们主要使用以下几种初始化方式:
cpp复制int a = 10; // 赋值初始化
int b(20); // 直接初始化
int arr[] = {1, 2, 3}; // 聚合初始化
对于自定义类型,我们通常通过构造函数进行初始化:
cpp复制class Point {
public:
Point(int x, int y) : x_(x), y_(y) {}
private:
int x_;
int y_;
};
Point p1(10, 20); // 直接构造
Point p2 = Point(30, 40); // 拷贝构造(通常会被优化为直接构造)
1.2 C++11统一初始化语法
C++11引入了大括号{}的统一初始化语法,旨在提供一种更一致、更安全的初始化方式。这种语法有几个显著特点:
- 类型安全增强:{}初始化会阻止窄化转换
- 语法一致性:几乎所有对象都可以用{}初始化
- 避免歧义:解决了C++中最令人头疼的解析问题
1.2.1 基本用法
cpp复制int x{5}; // 直接初始化
int y = {6}; // 拷贝初始化(可以省略=)
std::vector<int> v{1, 2, 3}; // 容器初始化
1.2.2 窄化转换检查
cpp复制double pi = 3.14159;
int a = pi; // 传统方式允许,但会丢失精度(仅警告)
int b{pi}; // 错误:窄化转换被禁止
int c{static_cast<int>(pi)}; // 正确:显式转换
1.3 自定义类型的{}初始化
对于自定义类型,{}初始化会尝试匹配最适合的构造函数:
cpp复制class Date {
public:
Date(int y, int m, int d) : year(y), month(m), day(d) {}
Date(std::initia
