C++列表初始化

基本概念

列表初始化是C++11引入的新特性,通过{}来初始化对象,其优点在于

  1. 统一的初始化语法,内置类型、数组、类和标准库容器都可以列表初始化
  2. 类型安全,可以防止窄化转换。窄化转换是指将较大的类型转换为较小的类型,这可能会导致数据的丢失。例如从doubleint就是窄化的类型转换,如果用double类型列表初始化int类型的变量,会发生编译错误,而传统的=初始化则不会

应用实例

1. 初始化内置类型

1
2
int a = {10};   // 使用列表初始化
int b{20}; // 另一种写法

2. 初始化数组

1
2
int arr[3] = {1, 2, 3}; // 数组初始化
int arr2[] = {1, 2, 3}; // 自动推导数组大小

3. 初始化类对象

1
2
3
4
5
6
7
8
class Person {
public:
std::string name;
int age;

Person(const std::string& n, int a) : name(n), age(a) {}
};
Person p1{"John", 30}; // 使用列表初始化类的成员变量,需要与成员变量的声明顺序一致

4. 初始化标准库容器

1
2
std::vector<int> vec = {1, 2, 3, 4}; // 初始化 vector
std::vector<int> vec2{5, 6, 7}; // 另一种写法

5. 初始化结构体

1
2
3
4
5
6
struct Point {
int x, y;
};

Point p1 = {10, 20}; // 使用列表初始化
Point p2{30, 40}; // 另一种写法

列表初始化与重载

函数可以使用列表初始化作为输入来重载

1
2
3
4
5
void foo(int a);  
void foo(const std::initializer_list<int>& list);

foo({10}); // 调用接受 initializer_list 的 foo 版本
foo(10); // 调用接受 int 的 foo 版本

类的构造函数也可以通过列表初始化来重载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass {  
public:
MyClass(const std::initializer_list<int>& values) {
for (int value : values) {
// 使用values初始化对象的状态...
}
}
// ... 其他成员函数 ...
};

int main() {
MyClass obj{10, 20, 30}; // 使用列表初始化创建对象
return 0;
}

C++列表初始化
https://guts.homes/2025/06/13/cpp-list-initialization/
作者
guts
发布于
2025年6月13日
许可协议