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; //可以编译通过