我是靠谱客的博主 缥缈煎蛋,最近开发中收集的这篇文章主要介绍C++值初始化,默认初始化,以及其他初始化类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


链接:https://www.zhihu.com/question/36735960/answer/68902926
来源:知乎

要理解C++(只谈C++11/14之后)的初始化类型,我认为要从最一般类型入手,那就是list initialization,其形式为:
[new] T [object] { arg1, arg2, ... };

list initialization & aggregate initialization
从简单情况来说,list initialization我们并不陌生,本质上就是:
  • 如果T是aggregate类型,list中的参数对object成员逐个初始化;或者,
  • 如果T不是aggregate类型,编译器查找最匹配list参数的T的构造函数。
而在第一种aggregate initialization情况中,如果list参数个数小于T的成员个数,剩余成员进行value initialization。

value initialization
那么如果在list initialization形式中,没有任何args,也就是
[new] T [object] {};
这时就称为值初始化。这个初始化类型的名字其实有点不明确,按我的理解,实质应该叫做“广义缺省初始化”。因为值初始化一般是三种处理方式:
  • 如果T有用户定义的缺省构造函数,直接调用;
  • 如果T有编译器生成的缺省构造函数,先0值初始化再调用;
  • 如果T根本不是类,直接0值初始化。
而以上三种其实都可以看作缺省初始化。

default initialization
[new] T object;
缺省初始化除了在值初始化过程中可能进行之外,也可以以上面形式单独进行。这种初始化的独特地方在于,如果T是非class类型,则给出非确定值(不赋值),比如:
int i; double d; bool b;
其实这也就是兼容最早的C行为。

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++值初始化,默认初始化,以及其他初始化类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部