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

背景

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,
初始化的过程如图所示,可以发现,在类内部初始化的变量,等效于在初始化列表中初始化,初始花的顺序与声明顺序相同。
在类内部初始化的好处是,等效于在每个构造函数上都加上了初始化列表。

局部变量:

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

本文链接:https://rainlin.top/archives/109
转载请注明转载自:https://rainlin.top
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇