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