對於初始化的問題,我之前一直傻傻分不清。有關初始化以及賦值的區別也是一問題,這次回過頭來看,配合<<CSAPP>>的內容,對初始化有了一些新的認識。
聲明: 在環境/上下文中指定一個變量的名字。也就是說,聲明僅僅是讓編譯器知道,而沒有實際分配空間。
初始化:給一個聲明后尚未初始化的變量一個有意義的初始值。
賦值 : 銷毀一個變量原來的值,並賦予一個新值。相當於改變了一個變量的狀態
初始化是在聲明一個變量的同時賦予它一個值,而賦值是已經聲明過了變量,后續再對它進行賦值操作。對於內置類型:
1 {//在一個塊中 2 int i;//默認初始化,不可直接使用 3 int j=0;//值初始化 4 j=1;//賦值
5 }
對於在一個塊作用域中的局部變量來說,該變量會默認初始化。而內置類型默認初始化的時候,對其進行操作是違法的,編譯器也會進行報錯。如果在全局中進行初始化,
//不在塊中 int i;//正確,i會被值初始化為0,也稱為零初始化
內置類型也是合法的,會被零初始化。
靜態變量在編譯期間就可以確定他們的值,靜態變量即使不提供初始值也會被零初始化。此外,類內靜態變量同樣如此,不過顯式初始化是一個比較好的選擇。
對於自定義類型和STL中的容器,
class A;
A a=A();//值初始化
std::vector<int> vec1;//默認初始化,調用默認構造函數
一個類對象進行默認初始化和值初始化,必須要有相應的默認構造函數。否則將會報錯,因為無法構造這個類。
上面是我自己的一些理解,<<C++ Primer>>總結了值初始化和默認初始化的適用場景:
值初始化:
(1)在數組初始化的過程中,如果提供的初始值數量少於數組的大小,剩下的元素會進行值初始化;
(2)當我們不使用初始值定義一個局部靜態變量時;
(3)當我們通過書寫形如T()的表達式顯示地請求值初始化時;
默認初始化:
(1)當我們在塊作用域內不使用任何初始值定義一個非靜態變量時,
(2)當一個類本身含有類類型成員且使用合成的默認構造函數時;
(3)當類類型的成員沒有在構造函數初始值列表中顯式地初始化時;