初始化是一个非常重要的语言特性,最常见的就是对对象进行初始化。在传统 C++ 中,不同的对象有着不同的初始化方法,例如普通数组、POD (plain old data,没有构造、析构和虚函数的类或结构体)类型都可以使用 {} 进行初始化,也就是我们所说的初始化列表。而对于类对象的初始化,要么需要通过拷贝构造、要么就需要使用 () 进行。这些不同方法都针对各自对象。在传统C++中可以使用初始化列表如下:
#include<bits/stdc++.h>
using namespace std;
class A{
public:
int a, b, c;
};
int main(){
int arr[4] = {1, 2 ,3 ,4}; // 数组初始化
A a = A{1,2,3}; // 传统类列表初始化
return 0;
}
为了解决这个问题,C++11 首先把初始化列表的概念绑定到了类型上,并将其称之为 initializer_list,允许构造函数或其他函数像参数一样使用初始化列表,这就为类对象的初始化与普通数组和 POD 的初始化方法提供了统一的桥梁。可以缉拿个类模板initializer_list作为构造函数的参数,则初始化列表就智能用于构造该函数。值得注意的是列表中的元素必须是5同一种类型或者可以转化为同一种类型。STL中提供了initializer_list作为参数构造函数,考虑vector的下列实例:
vector<int> a1(10); // 定义了大小为10未初始化的int型向量
vector<int> a2{10}; // 使用initializer-list初始化,a2只有一个元素初始化为10
vector<int> a3{1, 2, 3}; // 使用initializer-list初始化,a3有三个元素1,2,3
偷文件initializer_list提供了对类模板initializer_list的支持。该类中包含成员函数begin()和end()可以获得列表范围。除了用于构造函数外,initilazer_list还可以作为常规函数的参数。下面编写一个函数sum来求和,演示该模板类作为函数参数的使用。
#include<iostream>
#include<initializer_list>
using namespace std;
double sum(initializer_list<double> L){
double tol = 0.0;
for(auto p = L.begin(); p != L.end(); p++){
tol += *p;
}
return tol;
}
int main(){
double tol = sum({1.0, 2, 3, 4.5});
cout << tol <<endl;
return 0;
}