變量的幾種初始化方式

注:該整理並不全面或準確,僅供參考,歡迎評論交流。本文部份內容來自 C++primer 中文版第五版 原文。數組

變量初始化有幾種:函數

默認初始化:內置類型定義於函數體內其值未定義,定義於函數體外被初始化爲0;類類型由默認構造函數初始化code

值初始化:內置類型初始化爲0;類類型由默認構造函數初始化對象

顯示初始化(直接初始化和拷貝初始化):內置類型根據給定參數初始化;類類型由特定的構造函數初始化。class

因此,類對象經過構造函數初始化,若是缺乏某種構造函數,則不能進行某種初始化。變量

----------------------------------------------------------------------------------------------------------------------構造函數

變量(不管內置類型或類類型、單個或數組)若是不顯示初始化,則採用默認初始化;局部靜態變量則採用值初始化。im

int val; int val[10];
void func(){ int val2;     static int val3;  } 
void func(){ int val2[10]; static int val3[10]; } 
// val(不管單個對象獲數組,默認初始化)值爲0, val2(...默認初始化)值未定義! val3(...值初始化)值爲0 
// 類類型的默認初始化和值初始化都是經過默認構造函數。

動態分配的變量(不管內置類型或類類型、單個或數組)默認狀況下采用默認初始化,在類型後加單個括號以採用值初始化。數據

void func()  
{ 
    int *pobj = new int;    int *parr = new int[10];  
    int *pobj2 = new int(); int *parr2 = new int[10]();
}
// pobj 指向的對象值未定義! parr 指向的數組的元素值未定義!
// pobj2 指向的對象值爲0。  parr2 指向的數組的元素值都爲0

新標準的初始化列表可對單個或數組對象(不管是否動態分配)進行列表初始化。若爲單個對象,則初始化列表只能包含0個或1個初始值;若爲數組,則列表中初始值數量不超過數組維度,若是維度比提供的初始值數量大,則用提供的初始值初始化靠前的元素,剩下的元素被值初始化。static

int val {1};            int arr[10] = {1,2,3}; 
int *val = new val{1};  int *arr = new arr[10]{1,2,3}; 
 // val = 1; arr = 1,2,3,0,0,0,0,0,0,0

 ------------------------------------------------------------------------------------------------------------------

類對象經過構造函數進行初始化的。構造函數容許有一個初始值列表。對於類的數據成員,若是沒有在構造函數的初始值列表中顯示地初始化成員,則該成員將在構造函數體以前執行默認初始化(若是存在類內初始值,用它來初始化成員,不然默認初始化)。隨着構造函數體一開始執行,初始化就完成了。

相關文章
相關標籤/搜索