初始化列表
C++11 引入了一个强大的功能:初始化列表(std::initializer_list
)。它为容器、类和普通函数的初始化提供了一种简洁而统一的语法。
什么是初始化列表
初始化列表是一种标准库类型,用于存储由花括号 {}
包围的一组值。它允许以统一的方式将一组值传递给函数、构造对象或初始化容器。
语法形式如下:
std::initializer_list<T>
其中,T
是列表中元素的类型。
使用场景
1. 容器初始化
C++11 允许直接使用初始化列表来初始化标准容器,例如 std::vector
或 std::array
。
在 C++11 标准之前,std::vector 必须通过显式调用构造函数进行初始化,例如:
std::vector<int> numbers;
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(4);
numbers.push_back(5);
C++11 引入列表初始化后,可以直接写成:
std::vector<int> numbers = { 1, 2, 3, 4, 5 };
或写成
std::vector<int> numbers { 1, 2, 3, 4, 5 };
在 std::vector<int>
的实现中是这样的:
vector(std::initializer_list<T> init, const Allocator& alloc = Allocator());
注意:
在 std::vector<int> numbers = { 1, 2, 3, 4, 5 };
中,= 被称为 拷贝列表初始化(Copy List Initialization)。
如果省略 =,即写成 std::vector<int> numbers{ 1, 2, 3, 4, 5 };
,则是 直接列表初始化(Direct List Initialization)。
在多数情况下,两者行为相同,但省略 = 更加高效,因为省去了潜在的拷贝操作。
示例代码
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {
1, 2, 3, 4, 5}; // 使用初始化列表初始化
for (int v : vec) {
std::cout << v << " ";
}
return 0;
}
输出:
1 2 3 4 5
2. 自定义类的初始化
初始化列表可以作为构造函数的参数,用于简化对象的初始化。
示例代码
#include <iostream>
#include <initializer_list>
class MyClass {
public:
MyClass(std::initializer_list<int> list) {
for (int value : list) {
std::cout << value << " ";
}
}
};
int main() {
MyClass obj = {
10, 20, 30, 40}; // 使用初始化列表初始化
return 0;
}
输出:
10 20 30 40
自定义类提供匹配的构造函数
#include <iostream>
#include <initializer_list>
class MyClass {
private:
int a, b