背景
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,
初始化的过程如图所示,可以发现,在类内部初始化的变量,等效于在初始化列表中初始化,初始花的顺序与声明顺序相同。
在类内部初始化的好处是,等效于在每个构造函数上都加上了初始化列表。
局部变量:
局部变量位于栈区,也就意味着,当定义一个变量后,在未进行初始化时,其所占内存中的数据是随机的,所以基本变量未初始化为随机值,而类变量在调用构造函数后,未初始化的成员变量的值也是随机的