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

    xiaoxiao2021-12-14  43

           学习了博主的《漫谈继承技术》系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 《灵活而奇特的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++语言特性相关的知识和一些特性的理解和掌握。当然,如果你想了解关于继承方面的技术,请关注博主《漫谈继承技术》系列博文。

    转载请注明原文地址: https://ju.6miu.com/read-968758.html

    最新回复(0)