不管是为了统一性,还是避免发生窄化转换,尽可能使用初始化列表。
- 说明
- 哪些对象可以使用列表初始化?
- 代码演示
说明
C++11 引入了列表初始化(也称为统一初始化或初始化列表),它是一种使用花括号 {} 来初始化对象的语法,例如 int a{5};
。
列表初始化的优点包括初始化对象时不允许发生窄化转换(例如将 double 隐式转换为 int 时丢失精度)
能够初始化任何对象,只要它支持适当的构造函数或有合适的初始化器列表重载。
哪些对象可以使用列表初始化?
几乎所有类型的对象都可以使用列表初始化,包括:
- 基本数据类型(如
int
、double
等) - 类对象(如果有适当的构造函数)
- 数组
- STL 容器(如
std::vector
,std::map
等) - 初始值列
std::_list
:轻量级的容器类型,专门设计来接收花括号初始化列表中的元素,可以接收一个任意长度的同类型元素列表。(C++11)
代码演示
#include <iostream>
#include <vector>
#include <initializer_list>// 一个简单的类,展示带有构造函数的列表初始化
class MyClass {
public:MyClass(std::initializer_list<int> lst) {for (auto elem : lst) {std::cout << elem << ' ';}std::cout << '\n';}
};void print(std::initializer_list<int> vals) {for (auto p = vals.begin(); p != vals.end(); ++p) {std::cout << *p << "\n";}
}int main() {// 基本数据类型的列表初始化int a{ 5 };double b{ 3.14 };char c{ 'A' };// 不允许窄化转换// int d{3.14}; // 错误:窄化转换// 类对象的列表初始化MyClass obj{ 1, 2, 3, 4, 5 };// 数组列表初始化int arr[]{ 1, 2, 3, 4, 5 };// STL 容器的列表初始化std::vector<int> vec{ 1, 2, 3, 4, 5 };//初始值列print({ 1, 2, 3, 4, 5 }); // 使用花括号初始化列表// 打印演示std::cout << "a: " << a << '\n'<< "b: " << b << '\n'<< "c: " << c << '\n';std::cout << "arr: ";for (auto elem : arr) {std::cout << elem << ' ';}std::cout << '\n';std::cout << "vec: ";for (auto elem : vec) {std::cout << elem << ' ';}std::cout << '\n';return 0;
}
运行结果: