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

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

  1. 灵活而奇特的C++语言特性——const(一)

    学习了博主的<漫谈继承技术>系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 <灵活而奇特的C++语言特性> ,主要包括引用.常量(const).常量表达式(con ...

  2. 灵活而奇特的C++语言特性——typedef aliases

    学习了博主的<漫谈继承技术>系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 <灵活而奇特的C++语言特性> ,主要包括引用.常量(const).常量表达式(con ...

  3. # Python3 面试试题--Python语言特性

    Python语言特性 1 Python的函数参数传递 看两个例子: a = 1 def fun(a):a = 2 fun(a) print(a) # 1 a = [] def fun(a):a.app ...

  4. 语言特性与API设计

    我平时的主要工作之一,便是编写一些基础及通用的类库,能够在项目中大量复用.换句话说,我的工作目的,是让其他开发人员可以更好地完成工作.因此,如何设计更容易使用的API是我经常要考虑的东西,偶尔也会有一 ...

  5. 总结Python的几点语言特性

    总结Python的几点语言特性 Python语言简洁,优雅,扩展性强...... 这些特点常被Python程序员挂在嘴边,确实也都是Python的特点. 要讨论语言的特点或特性,可以得到很多不同的结论 ...

  6. c 11 主要的新语言特性,C 11系列

    什么是C++0x? C++0x是C++最新标准标准化过程中的曾用名,在这一系列文章中我们将介绍最新标准添加的一系列新的语言特性.在2011年9月份,C++0x正式由官方发布并命名C++11,现在很多编 ...

  7. Python语言特性和优缺点及什么是鸭子类型?

    1)Python语言特性? Python是静态还是动态类型?是强类型还是弱类型?         Python是动态强类型语言(不少人误以为是弱类型) 动态还是静态指的是编译期还是运行期确定类型 强类 ...

  8. 一本深入探讨C++11~C++17最新语言特性的书推荐给你

    近10年来C++的更新可谓是非常频繁,这让我在2017年时感受到了一丝不安.那个时候我发现在开源平台上已经有很多项目采用C++11和C++14标准编写,其中不乏一些知名的代码库,而公司里所用的编译环境 ...

  9. AI算法工程师 | 02人工智能基础-Python基础(二)语言特性_控制语句_切片_数据类型

    文章目录 Python基础语法 一.Python语言特性 使用Jupyter Notebook Python是强类型的动态脚本语言 Python中一切皆对象 二.流程控制语句 条件判断语句 循环语句 ...

最新文章

  1. SpringMVC解决静态资源不能访问
  2. 100%移植阿里云移动测试技术,竟仅需1周?! ——移动测试专有云(1)
  3. 350个特性看透ES6
  4. [LeetCode] Add Two Numbers
  5. Windows 7安装Virtual Server 2005 R2 SP1
  6. IP Scanner Pro for mac(局域网IP扫描软件)
  7. Windows服务器双网卡冲突
  8. 介绍identity matrices
  9. 九型人格:三、The proformer 实干者 - 我若没有成就,就没有人会爱我。
  10. 【已解决】python 使用xlrd,xlwt 修改execl单元格的背景色
  11. 鸿蒙OS应用(HarmonyOS Application)开发常见示例源码
  12. Java语言概述以及环境搭建
  13. 图像处理_ISP_坏点矫正
  14. mysql几种性能测试的工具使用
  15. pyside6 - 简单了解
  16. 在PCB中快速找到原理图的原件
  17. Unity AssetBundle一个需要注意的地方
  18. 南开大学计算机考研难不难,南开大学考研难吗?一般要什么水平才可以进入?...
  19. 60条令你大吃一惊的小常识
  20. 有没有关于python的壁纸_Python 实战之精美壁纸下载

热门文章

  1. 聚焦安全,德施曼极致的工匠精神
  2. 【译】第42节---EF6-DbSet.AddRange DbSet.RemoveRange
  3. drop table 和 truncate table的区别
  4. 用C8T6坐小车的第三天
  5. 台达服务器怎么把绝对位置初始化,台达plc上电时参数的自动初始化实例
  6. Typora代码块快捷键
  7. JSONObject详解
  8. python判断字符是否是数字和字母_python判断字符是否为字母和数字
  9. 快手字体反爬虫?请给我10分钟,让我破了他
  10. 【Python】Numpy简明教程