類成員變量的默認(rèn)初始化
類成員的默認(rèn)初始化過程比較復(fù)雜躲因,依據(jù)類的不同初始化方式和作用范圍,其行為也有不同忌傻。下面依據(jù)常用方式整理一下類成員變量的初始化過程大脉。假設(shè)有一個類Object,擁有成員變量number水孩,pointer镰矿,name,pname俘种,refname等來考慮初始化過程秤标。
class Object {
private:
int *ptr;
int number;
string name;
string *pname;
string &refname;
public:
Object() {}
};
當(dāng)我們調(diào)用
int main() {
Object obj;
}
類的成員變量將會被怎樣進(jìn)行初始化宙刘?
這里我們只考慮在棧(stack)上調(diào)用這種最常用的方式苍姜,因?yàn)檫@種情形默認(rèn)初始化的程度是最小的,其它方式以這種行為考慮可以很大程度上涵蓋悬包。
針對不同類型的成員變量初始化方式的總結(jié)
類成員變量的默認(rèn)初始化(隱式初始化)過程完全相同于函數(shù)中本地變量的初始化過程衙猪。
對于原生類型,int類型或者指針類型等布近,他們不會被初始化垫释。但是,他們會使用類實(shí)例內(nèi)存地址中任何已經(jīng)存在的野值作為自己的值撑瞧,也就是說棵譬,在這種情形下,這些類型的類成員變量的值可能包含不可預(yù)知的垃圾值预伺。所以原生類型必須要明確的初始化茫船。
針對對象類型,在這種情形下扭屁,默認(rèn)構(gòu)造器會被調(diào)用算谈。
針對引用類型,變量不被初始化是非法的料滥,會收到編譯器的警告然眼,編譯無法通過。
針對上面的不同情形葵腹,Object類默認(rèn)初始化過程總結(jié)如下
int *ptr; // 包含任意野值
int number; // 包含任意野值
string name; // 空string
string *name; // 包含任意野值
string &refname; //編譯錯誤
更多情形請參考statckoverflow帖子