C++ 11 新特性之统一初始化语法

C++  之前的初始化语法很乱,有四种初始化方式,而且每种之前甚至不能相互转换。让人有种剪不断,理还乱的感觉(曾经去面试,就有人问我string有几种初始化方式,当时就说出了两种,fuck,面试官还得意的说,你连基本的初始化方式都记不清,还做啥2dx的开发。当时我就想反驳,但是想想就算了,跟这样的人没必要,估计这人也是被老谭给毒害的一代),黑了那么久的C++初始化方式,大家可能不信,那么现在我就带大家领略一下C++的各种菊紧蛋疼的初始化方式,废话不多说,下面是代码:

1,小括号初始化方法:

    //小括号初始化方法
    int a = int(5);
    string str1 = string("hello");

2,赋值初始化方法:

    int a = 3;
    string str = "hello";

3,POD聚合,也就是经常使用的大括号初始分方法:

int arr[2] = {0,1};

4,构造函数初始化:

class test{
    test(int var1,int var2):a(var1),b(var2){};
private:
    int a;
    int b;
};

OK,以上就是C++03之前的四种初始化方法,当然不是每种类型都有四种初始化方式。具体是那种有那种没有,对不起,我记不清,当然如果你精力够的话,可以自己去分分类啦,然后在记住啦,只要你有时间和精力,就可以啦。看到这里,估计你和我的感受差不多了,感觉这么多种初始化方式没必要呀,为毛不去统一一下,降低学习C++的难度呢?

这不,C++的开发者们急我们之所急,在N年后的C++11中推出了统一初始化方法的新特性(你可能会问:N年后才推出还叫急我们之所急?哈哈,不要在意这些细节啦,说道这里让我想起了范爷的那句经典广告语:统一初始化语法,你值得拥有)。

好的,下面我们就来讲解一下统一初始化方法的使用,老规矩,先上代码(没代码我说个毛):

class test{
    int a ,b,c[4];
    int *d = new int[3]{1,2,3,4};//C++ 11提供的独有的初始化方式
    vector<int> vec = {1,2,3}; //c++ 11 独有的
    map<string, int> _map = {{"hello",1},{"world",2}};//c++ 11 独有的
public:
    test(int i ,int j):a(i),b(j),c{2,3,4,2}{};
};

int main(int argc, const char * argv[])
{
    
    test t{1,2};//初始化test类
    return 0;
}

看完上面的代码,可能你已经发现了一个规律,是什么呢?对了,就是初始化都是用的{}。你可能会问这算毛的规律,但是这就是C++11 采用的策略,即: 一个类型拥有初始化串行建构式( TypeName(initializer_list<SomeType>); ),而初始化串行符合 sequence 建构式的类型,那么它比其他形式的建构式的优先权都来的高。(这句话我也看不太懂,但是文档就这么说的)。

你可能会说这个你也记不住,这里说一下关于统一初始化的总结:

无论是类的变量,数组,stl的容器,类的构造,都统一使用{},以后只要是初始化就首先考虑{}的初始化就OK了。

好了,今天的课程就到这儿(别问我这次为什么没说统一初始化方法需要注意的地方,因为他没有啊,这货就是一个彻头彻尾的好东东啊,哈哈)。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值