類成員變量的默認(rèn)初始化
類成員的默認(rèn)初始化過(guò)程比較復(fù)雜,依據(jù)類的不同初始化方式和作用范圍,其行為也有不同。下面依據(jù)常用方式整理一下類成員變量的初始化過(guò)程。假設(shè)有一個(gè)類Object,擁有成員變量number,pointer,name,pname,refname等來(lái)考慮初始化過(guò)程。
class Object {
private:
int *ptr;
int number;
string name;
string *pname;
string &refname;
public:
Object() {}
};
當(dāng)我們調(diào)用
int main() {
Object obj;
}
類的成員變量將會(huì)被怎樣進(jìn)行初始化?
這里我們只考慮在棧(stack)上調(diào)用這種最常用的方式,因?yàn)檫@種情形默認(rèn)初始化的程度是最小的,其它方式以這種行為考慮可以很大程度上涵蓋。
針對(duì)不同類型的成員變量初始化方式的總結(jié)
類成員變量的默認(rèn)初始化(隱式初始化)過(guò)程完全相同于函數(shù)中本地變量的初始化過(guò)程。
對(duì)于原生類型,int類型或者指針類型等,他們不會(huì)被初始化。但是,他們會(huì)使用類實(shí)例內(nèi)存地址中任何已經(jīng)存在的野值作為自己的值,也就是說(shuō),在這種情形下,這些類型的類成員變量的值可能包含不可預(yù)知的垃圾值。所以原生類型必須要明確的初始化。
針對(duì)對(duì)象類型,在這種情形下,默認(rèn)構(gòu)造器會(huì)被調(diào)用。
針對(duì)引用類型,變量不被初始化是非法的,會(huì)收到編譯器的警告,編譯無(wú)法通過(guò)。
針對(duì)上面的不同情形,Object類默認(rèn)初始化過(guò)程總結(jié)如下
int *ptr; // 包含任意野值
int number; // 包含任意野值
string name; // 空string
string *name; // 包含任意野值
string &refname; //編譯錯(cuò)誤
更多情形請(qǐng)參考statckoverflow帖子