天天看點

C++ 變量的預設初始化和值初始化

值初始化和預設初始化的适用場景:

值初始化:

(1)在數組初始化的過程中,如果提供的初始值數量少于數組的大小,剩下的元素會進行值初始化;

(2)靜态static變量、定義在塊作用域外的全局變量,如果沒有顯式的初始值,将執行值初始化;

(3)當我們通過書寫形如T()的表達式(例如 int())顯式地請求值初始化時;

預設初始化:

(1)當我們在塊作用域内(類内也屬于塊作用域内)不使用任何初始值定義一個非靜态變量時;

(2)當一個類本身含有類類型成員且使用合成的預設構造函數時;

(3)當類類型的成員沒有在構造函數初始值清單中顯式地初始化時;

一、相關概念:

聲明:在環境/上下文中指定一個變量的名字。也就是說,聲明僅僅是讓編譯器知道,而沒有實際配置設定空間。

初始化:給一個聲明後尚未初始化的變量一個有意義的初始值。

指派 : 銷毀一個變量原來的值,并賦予一個新值。相當于改變了一個變量的狀态

二、初始化是在聲明一個變量的同時賦予它一個值,而指派是已經聲明過了變量,後續再對它進行指派操作。對于内置類型:

 三、對于定義了自己的構造函數的類類型(例如string)來說,不管采用預設初始化還是值初始化,對象都會通過預設構造函數來初始化。

        但對于内置類型,值初始化的内置類型對象有着良好定義的值,而預設初始化的對象的值則是未定義的。

        對于類中那些依賴于編譯器合成的預設構造函數的内置類型成員,如果他們未在類内被初始化,那麼它們的值也是未定義的。

四、定義于塊作用域内(類内也屬于塊作用域内)的内置類型變量将不被初始化,其值未定義;定義于塊作用域外的全局變量被值初始化為0。

靜态static變量如果沒有顯式的初始值,它将執行值初始化。

五、對于自定義類型和STL中的容器,

一個類對象進行預設初始化和值初始化,必須要有相應的預設構造函數。否則将會報錯,因為無法構造這個類。