注:該整理並不全面或準確,僅供參考,歡迎評論交流。本文部份內容來自 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
------------------------------------------------------------------------------------------------------------------
類對象經過構造函數進行初始化的。構造函數容許有一個初始值列表。對於類的數據成員,若是沒有在構造函數的初始值列表中顯示地初始化成員,則該成員將在構造函數體以前執行默認初始化(若是存在類內初始值,用它來初始化成員,不然默認初始化)。隨着構造函數體一開始執行,初始化就完成了。