灵活而奇特的C++语言特性——统一初始化

       学习了博主的《漫谈继承技术》系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 《灵活而奇特的C++语言特性》 ,主要包括引用、常量(const)、常量表达式(constexpr)、静态(static)、外部(expert)、类型定义(typedef)、类型别名(aliases)、类型转换、作用域解析、统一初始化、显示转换运算符、特性(attribute)、用户自定义文本、头文件、可变长度参数列表和预处理器宏。尽管这个知识清单显得有点凌乱,但是这些话题都是博主经过精心挑选,是容易混淆的语言特性。本篇我们来学习一下统一初始化和初始化列表(initializer_list)的观念以及使用场景,增进大家对《灵活而奇特的C++语言特性》的理解。

统一初始化

       在C++11之前,初始化类型学并非总是统一的。自C++11,引入了初始化列表(initializer_list),可以使用统一的方式来初始化。统一初始化并不局限于结构和类,它还可以用于初始化C++中的任何类型。举个栗子吧。

#include<iostream>

#include<initializer_list>

usingnamespacestd;

 

classDemo

{

public:

    Demo(charcValue =' ', intnValue = 0);

    virtual~Demo(){}

 

    voidshow() const;

private:

    charm_cValue;

    intm_nValue;

};

 

Demo::Demo(charcValue/*= ' '*/,int nValue/*= 0*/)

    :m_cValue(cValue), m_nValue(nValue)

{

 

}

 

voidDemo::show()const

{

    cout<<"m_cValue: "<< m_cValue << endl;

    cout<<"m_nValue: "<< m_nValue << endl;

}

 

int main(intargc,char**argv)

{

 

    //使用初始化列表初始化对象

    Demo myDemo1('c', 12);

    Demo myDemo2({ 'd', 15 });

    Demo myDemo3 = { 'f',20 };

    Demo myDemo4{ 'g', 34 };

 

    //输出对象数据成员值

    myDemo1.show();

    myDemo2.show();

    myDemo3.show();

    myDemo4.show();

 

    //统一初始化并不局限于结构和类,它还可以用于初始化C++中的任何类型

    intnValue1 = 10;

    intnValue2(20);

    intnValue3 = { 30 };

    intnValue4 { 40 };

 

    return0;

}

 

程序运行结果:


统一初始化的其他用法:

①可以用于把变量初始化为0,只需指定一些列空括号就可以。

②可以阻止窄化(narrowing)。注意,C++是隐式地执行窄化的。

③可以用来初始化动态非配的数组。

④可以在构造函数初始化器中初始化类成员数组。

⑤简化了参数数量可变函数的编写

       初始化列表的确是一个比较好用的东西,博主列举了其中一些比较常用的特性供大家学习,希望对大家了解初始化列表有一点帮助。下面咱们举个栗子来用用初始化列表的这些特性吧。

#include<iostream>

#include<initializer_list>

usingnamespacestd;

 

//初始化列表简化了参数数量可变函数的编写

int Sum(initializer_list<int>list)

{

    intresult = 0;

 

    //for each累加列表中的值

    foreach(constint&varin list)

    {

        result+= var;

    }

 

    returnresult;

}

 

int main(intargc,char**argv)

{

    //初始化列表可以用于把变量初始化为0

    intnValue{};

    cout<<"nValue: "<< nValue << endl;

 

    //初始化列表可以阻止窄化(narrowing)。注意,C++是隐式地执行窄化的

    intnValue1 = 1.56;//C++是隐式地执行窄化的

    //intnValue2{2.89};//error,初始化列表可以阻止窄化(narrowing

 

    //初始化列表可以用来初始化动态非配的数组

    constintsize = 5;

    int*nPVArray = new int[size]{1,2, 3, 4, 5};

    delete[]nPVArray;

    nPVArray =nullptr;

 

    //调用基于initializer_list编写的参数数量可变的函数

    intresult = Sum({0, 1, 2, 3, 4, 5, 6, 7, 8 ,9});

    cout<<"result: "<< result << endl;

    //Sum({1, 2, 2.89 });//error,初始化列表可以阻止窄化(narrowing

 

    return0;

}

 

程序运行结果:


如果将上面代码中的注释去掉,编译会报以下错误:



       经过本篇博文的学习,相信大家已经理解了统一初始化的概念,掌握了初始化列表(initializer_list)的用法,熟悉了统一初始化的使用场景。当别人再提起初始化列表的概念时,不至于一脸懵逼。好啦,那咱们今天的学习就到这里了。

             如果想了解更多关于C++语言特性相关的知识,请关注博主《灵活而奇特的C++语言特性》系列博文,相信你能够在那里寻找到更多有助你快速成长和加深你对C++语言特性相关的知识和一些特性的理解和掌握。当然,如果你想了解关于继承方面的技术,请关注博主《漫谈继承技术》系列博文。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值