不管是为了统一性,还是避免发生窄化转换,尽可能使用初始化列表。
- 说明
- 哪些对象可以使用列表初始化?
- 代码演示
说明
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;
}
运行结果: