C++11新特性之初始化列表

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


猜你喜欢

转载自blog.csdn.net/jxianxu/article/details/80523174