C++類成員變量的默認(rèn)初始化(隱式初始化)過(guò)程

類成員變量的默認(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帖子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容