前言
最近学了 CPP11
,老师介绍了一些 CPP11
的新特性,今天来简单进行分享一下关于CPP11新语法“列表初始化”的语法问题。
我想你也会好奇列表初始化
与初始化列表
两者是一个概念吗?CPP11是如何通过列表对各种类型进行初始化的呢?
在本篇博客中将简单介绍一下两个概念的区分以及列表初始化的过程…
1.列表初始化是什么?
简而言之,列表初始化
是用花括号对数组、自定义类型、容器进行初始化。 实际上,就是简化CPP写法的一种方法,没有什么很难理解的地方。
那接下来我就依次介绍CPP初始化数组、结构体、自定义类型、以及容器的方法的。
2.C用花括号初始化数组和结构体
我们知道,C语言在很早的时候就支持用花括号初始化数组和结构体了。一般是这么玩的:
CPP就是直接继承C语言的语法,对数组和结构体类型直接沿用C语言的语法特性即可。
3.对类对象的初始化
我们知道,CPP也引入了类的概念,开始面向对象编程
,因此类对象怎么用花括号进行初始化呢?
在不做优化的情况下,编译器先根据{1,1}这一内容调用B对象的构造函数生成一个B类型的临时对象,之后再把这个临时生成的对象通过拷贝构造函数来构造B,其本质是一个隐式类型转换 + 拷贝构造的过程。
但是,通常编译器为了效率的考量都会做优化,会直接用{1,1}这一内容进行隐式类型转换,直接构造为B b…
注意:如果你写的自定义类型没有写构造函数,大概率会不支持…因为这其中要调用构造函数
当然,如果你不想让编译器使用构造函数初始化,可以在构造函数前面加上:explicit
关键字,当然列表初始化也就不支持了就是了。
4.对容器的初始化
以vector为例,容器的初始化最大的问题是,初始化参数的数量不确定…比如我可以初始化1个值,也可以是100个值,如果只用简单的隐式类型转换,那么相对应的我需要提供1个参数的构造函数,100个参数的构造函数…
为了解决上面初始化难题,CPP委员会制作了一个类,该类名字叫 <initializer_list>,就是初始化列表,这个类里面有两个指针,一个指针指向{}内第一个数的地址,第二个指针指向{}内最后一个数的地址的下一个位置。然后CPP委员会再为基本每个容器提供<initializer_list>为参数的构造函数即可。
这里我们就可以明白:列表初始化和初始化列表不是一个概念,但是有关联。
⭕列表初始化
是CPP11提出的一种新的语法概念,可以用{}对内置类型、数组、结构体、类对象和容器进行初始化操作
⭕对应的,初始化列表
是一种容器,旨在通过这种容器的帮助顺利用{}完成对其他容器的列表初始化操作。
除了上面所说内容之外,CPP11的列表初始化还提供了其他的一些语法特性:
5.列表初始化允许省略=
什么意思呢?就是如下图:
6.列表初始化对于调用单参数构造函数允许省略{}
什么意思呢?比如说我有一个C类,他里面只有一个成员变量,_c,其构造函数也是C(int c),只有一个参数,这种可以直接省略掉{}
总结
我们围绕列表初始化的话题简单说了一下相关语法…这个列表初始化操作最好用的地方就是初始化容器的时候方便了很多…其他感觉就用处一般般了…
比如,我们在写map容器初始化的时候,可以直接这样写:
这样写会方便很多…
EOF