基本概念
列表初始化是C++11引入的新特性,通过{}来初始化对象,其优点在于
- 统一的初始化语法,内置类型、数组、类和标准库容器都可以列表初始化
- 类型安全,可以防止窄化转换。窄化转换是指将较大的类型转换为较小的类型,这可能会导致数据的丢失。例如从
double到int就是窄化的类型转换,如果用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}; 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}); foo(10);
|
类的构造函数也可以通过列表初始化来重载
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) { } } }; int main() { MyClass obj{10, 20, 30}; return 0; }
|