概述
链接:https://www.zhihu.com/question/36735960/answer/68902926
来源:知乎
要理解C++(只谈C++11/14之后)的初始化类型,我认为要从最一般类型入手,那就是list initialization,其形式为:
list initialization & aggregate initialization
从简单情况来说,list initialization我们并不陌生,本质上就是:
value initialization
那么如果在list initialization形式中,没有任何args,也就是
这时就称为值初始化。这个初始化类型的名字其实有点不明确,按我的理解,实质应该叫做“广义缺省初始化”。因为值初始化一般是三种处理方式:
default initialization
缺省初始化除了在值初始化过程中可能进行之外,也可以以上面形式单独进行。这种初始化的独特地方在于,如果T是非class类型,则给出非确定值(不赋值),比如:
其实这也就是兼容最早的C行为。
zero initialization
0值初始化除了在值初始化过程中可能进行之外,也可以单独作用于静态(或者线程局部)变量:
小结
所有其他初始化形式都是list initialization的特殊表现形式或者与其相关。理解的要点在于,list中的参数要么按构造函数的参数声明顺序,要么按aggregate类型成员声明顺序,逐个赋值。当某些成员没有被这样显示给定值时,进行广义缺省初始化(value initialization):或调用缺省构造函数,或赋0值。这么看来,这一堆初始化其实挺符合我们的一贯认知。
五种初始化类型:
list initialization (since C++11)
aggregate initialization 这是list initialization对aggregate类型的特例
value initialization 值初始化
default initialization 缺省初始化
zero initialization 0值初始化
[new] T [object] { arg1, arg2, ... };
list initialization & aggregate initialization
从简单情况来说,list initialization我们并不陌生,本质上就是:
- 如果T是aggregate类型,list中的参数对object成员逐个初始化;或者,
- 如果T不是aggregate类型,编译器查找最匹配list参数的T的构造函数。
value initialization
那么如果在list initialization形式中,没有任何args,也就是
[new] T [object] {};
- 如果T有用户定义的缺省构造函数,直接调用;
- 如果T有编译器生成的缺省构造函数,先0值初始化再调用;
- 如果T根本不是类,直接0值初始化。
default initialization
[new] T object;
int i; double d; bool b;
zero initialization
0值初始化除了在值初始化过程中可能进行之外,也可以单独作用于静态(或者线程局部)变量:
static T object;
小结
所有其他初始化形式都是list initialization的特殊表现形式或者与其相关。理解的要点在于,list中的参数要么按构造函数的参数声明顺序,要么按aggregate类型成员声明顺序,逐个赋值。当某些成员没有被这样显示给定值时,进行广义缺省初始化(value initialization):或调用缺省构造函数,或赋0值。这么看来,这一堆初始化其实挺符合我们的一贯认知。
五种初始化类型:
list initialization (since C++11)
aggregate initialization 这是list initialization对aggregate类型的特例
value initialization 值初始化
default initialization 缺省初始化
zero initialization 0值初始化
最后
以上就是缥缈煎蛋为你收集整理的C++值初始化,默认初始化,以及其他初始化类型的全部内容,希望文章能够帮你解决C++值初始化,默认初始化,以及其他初始化类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复