值初始化和預設初始化的适用場景:
值初始化:
(1)在數組初始化的過程中,如果提供的初始值數量少于數組的大小,剩下的元素會進行值初始化;
(2)靜态static變量、定義在塊作用域外的全局變量,如果沒有顯式的初始值,将執行值初始化;
(3)當我們通過書寫形如T()的表達式(例如 int())顯式地請求值初始化時;
預設初始化:
(1)當我們在塊作用域内(類内也屬于塊作用域内)不使用任何初始值定義一個非靜态變量時;
(2)當一個類本身含有類類型成員且使用合成的預設構造函數時;
(3)當類類型的成員沒有在構造函數初始值清單中顯式地初始化時;
一、相關概念:
聲明:在環境/上下文中指定一個變量的名字。也就是說,聲明僅僅是讓編譯器知道,而沒有實際配置設定空間。
初始化:給一個聲明後尚未初始化的變量一個有意義的初始值。
指派 : 銷毀一個變量原來的值,并賦予一個新值。相當于改變了一個變量的狀态
二、初始化是在聲明一個變量的同時賦予它一個值,而指派是已經聲明過了變量,後續再對它進行指派操作。對于内置類型:
三、對于定義了自己的構造函數的類類型(例如string)來說,不管采用預設初始化還是值初始化,對象都會通過預設構造函數來初始化。
但對于内置類型,值初始化的内置類型對象有着良好定義的值,而預設初始化的對象的值則是未定義的。
對于類中那些依賴于編譯器合成的預設構造函數的内置類型成員,如果他們未在類内被初始化,那麼它們的值也是未定義的。
四、定義于塊作用域内(類内也屬于塊作用域内)的内置類型變量将不被初始化,其值未定義;定義于塊作用域外的全局變量被值初始化為0。
靜态static變量如果沒有顯式的初始值,它将執行值初始化。
五、對于自定義類型和STL中的容器,
一個類對象進行預設初始化和值初始化,必須要有相應的預設構造函數。否則将會報錯,因為無法構造這個類。