谈谈C++中变量初始化的问题

作者: rainlin 分类: 程序语言 发布时间: 2017-11-07 11:08

背景

C++中的变量分为外部变量(全局变量,静态变量)和局部变量,而变量本身又分为基本类型变量和类变量,在初始化的时候,各种变量存在不同的处理方式,在此总结记录下

初始化与赋值

初始化和赋值对于基本变量而言,基本没有区别,但对于类变量而言,初始化会调用构造函数,而赋值则是调用拷贝构造函数
初始化的写法为:
T a=T(...);
T a;
T a(...);
注意若调用默认构造函数(无参数),应写成T a;而不是T a();后者为函数声明。

一个核心知识点:

全局变量,静态变量在全局区(静态区),对应到编译文件的.data,.bbs段,未初始化变量在.bss段,已初始化在.data段,而局部变量在栈区。
.bbs段在编译目标文件中不占空间,但在程序被载入内存时,需要给该段分配空间。
.data段在编译目标文件中要占空间,在程序被载入内存时,直接被载入到内存中。

外部变量(全局,静态变量):

当外部变量为基本类型变量时:

若未初始化,编译时位于.bbs段,程序运行时,.bbs段默认被置为0,所以此时该变量为0
若已初始化,编译时位于.data段,程序运行时,该变量地址为内存中.data段的相应位置

当外部变量为类变量时:

无论类变量是否初始化,即是否调用指定构造函数,该实例变量均处于.bbs段,类的初始化均在构造函数中进行,即使类内部已经初始化数据成员变量,其本质仍然是在构造函数中初始化,其顺序为 初始化列表,类内部初始化值->构造函数,前面两个按照变量声明顺序初始化,发生在构造函数内部过程之前。

观察上图,A a(5)初始化了一个全局变量a,
初始化的过程如图所示,可以发现,在类内部初始化的变量,等效于在初始化列表中初始化,初始花的顺序与声明顺序相同。
在类内部初始化的好处是,等效于在每个构造函数上都加上了初始化列表。

局部变量:

局部变量位于栈区,也就意味着,当定义一个变量后,在未进行初始化时,其所占内存中的数据是随机的,所以基本变量未初始化为随机值,而类变量在调用构造函数后,未初始化的成员变量的值也是随机的

 

 

本文链接: http://rainlin.top/archives/109
转载请注明转载自: Rainlin Home

发表评论

电子邮件地址不会被公开。 必填项已用*标注