C++11支持对非内置类型如vector进行初始化列表方式的初始化:
#include<vector> using namespace std; int a[] = {1,2,3}; int b[] {3,4,5}; vector<int, float> d={{1, 1.2},{2, 3.3},{3.3.8}};
C++11丰富了自动变量和全局变量的初始化方式:
int a = {3+3}; int a = {1+1}; int a(3+4); int a{3+4};
后两种形式可用于new操作符:
int * I = new int(2); double *d = new double{1.3f};
C++11支持用户自定义类型的初始化列表,只需包含头文件<initializer_list>并且在参数中以initialize_list<T>模板类为构造函数的参数即可:
#include <iostream> #include <initializer_list> #include <string.h> using namespace std; class Base { public: Base(initializer_list<pair<string, int> > b) { auto i = b.begin(); for(; i!=b.end();++i) data.push_back(*i); } private: vector<pair<string, int> > data; }; Base base = {{"abc",1},{"def",2},{"fgh",3}} ;
同样的C++11也支持函数的参数列表:
#include <iostream> #include <initializer_list> #include <string.h> using namespace std; void MyFun(initializer_list<int> iL) { //..... } int main() { MyFun({1,2,3}); MyFun({});//空列表 }
初始化列表还可用于函数返回值:
vector<int> MyFunc() { return {1, 3}; }
总结:
初始化列表的最大优点是可以防止类型收窄。类型收窄是指可以使得数据变化或者精度丢失的隐士类型转换,例如把一个double类型值赋给一个整形变量,需要注意的是,如果变量a从类型A转换为类型B,其值在B中也是可以被表示的并且再转化为A能获得原有值的话,不能称为类型收窄:
const int x = 1024; const int y = 10; char a = x ; //收窄,但可以编译通过 char * b = new char(1024); //收窄,但可以编译通过 char c = {x}; //收窄,无法编译通过 char d = {y}; //可以编译通过 unsigned char e {-1}; //收窄,无法编译通过 float f{7}; //可以编译通过 int g {2.0f}; //收窄,无法编译通过 float * h = new float{1e48}; //收窄,无法编译通过 float i = 1.31l; //可以编译通过