初始設定式
文章推薦指數: 80 %
如何在C++ 中初始化類別、結構、陣列和基本類型。
... 陣列、 POD 類別、結構及等位都會將其成員初始化為零值。
零初始化在不同時期執行:.
跳到主要內容
已不再支援此瀏覽器。
請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。
下載MicrosoftEdge
其他資訊
目錄
結束焦點模式
語言
閱讀英文
儲存
目錄
閱讀英文
儲存
Twitter
LinkedIn
Facebook
電子郵件
目錄
初始設定式
發行項
05/04/2022
6位參與者
本文內容
初始設定式指定變數的初始值。
您可以初始化下列內容中的變數:
變數的定義中:
inti=3;
Pointp1{1,2};
函式的其中一個參數:
set_point(Point{5,6});
函式的傳回值:
Pointget_new_point(intx,inty){return{x,y};}
Pointget_new_point(intx,inty){returnPoint{x,y};}
初始設定式可能會有下列格式:
以括號刮住的運算式(或逗號分隔的運算式清單):
Pointp1(1,2);
運算式後面接著等號:
strings="hello";
以大括號括住的初始設定式清單。
該清單可能是空的,也可能包含一組清單(如下列範例所示):
structPoint{
intx;
inty;
};
classPointConsumer{
public:
voidset_point(Pointp){};
voidset_points(initializer_list
不同類型的初始化不會互斥,例如清單初始化可以觸發值初始化,而在其他情況下,則可觸發彙總初始化。
零初始化
零初始化是將變數設為隱含轉換為類型的零值:
數值變數初始化為0(或0.0、0.0000000000等)。
Char變數會初始化為'\0'。
指標會初始化為nullptr。
陣列、POD類別、結構及等位都會將其成員初始化為零值。
零初始化在不同時期執行:
在程式啟動時,對象是具有靜態期間的所有具名變數。
之後可以再次初始化這些變數。
在初始化值期間,對象是純量類型和使用空括號初始化的POD類別類型。
只初始化其成員子集的陣列。
以下舉例說明零初始化:
structmy_struct{
inti;
charc;
};
inti0;//zero-initializedto0
intmain(){
staticfloatf1;//zero-initializedto0.000000000
doubled{};//zero-initializedto0.00000000000000000
int*ptr{};//initializedtonullptr
chars_array[3]{'a','b'};//thethirdcharisinitializedto'\0'
intint_array[5]={8,9,10};//thefourthandfifthintsareinitializedto0
my_structa_struct{};//i=0,c='\0'
}
預設初始化
類別、結構和等位的預設初始化是使用預設建構函式的初始化。
預設建構函式可以使用沒有初始化運算式或new關鍵字來呼叫:
MyClassmc1;
MyClass*mc3=newMyClass;
如果類別、結構或等位沒有預設建構函式,則編譯器會發出錯誤。
定義純量變數時若未使用初始化運算式,則預設會初始化。
這些變數都具有不定值。
inti1;
floatf;
charc;
定義陣列時若未使用初始化運算式,則預設會初始化。
預設初始化陣列時,預設會初始化其成員,且其成員具有下列不定值(如下列範例所示):
intint_arr[3];
如果陣列成員沒有預設建構函式,則編譯器會發出錯誤。
常數變數的預設初始化
宣告常數變數時必須搭配使用初始設定式。
如果常數變數是純量類型,則會引發編譯器錯誤,如果是具有預設建構函式的類別類型,則會引發警告:
classMyClass{};
intmain(){
//constinti2;//compilererrorC2734:constobjectmustbeinitializedifnotextern
//constcharc2;//sameerror
constMyClassmc1;//compilererrorC4269:'constautomaticdatainitializedwithcompilergenerateddefaultconstructorproducesunreliableresults
}
靜態變數的預設初始化
未使用初始設定式宣告的靜態變數會初始化為0(隱含地轉換為類型)。
classMyClass{
private:
intm_int;
charm_char;
};
intmain(){
staticintint1;//0
staticcharchar1;//'\0'
staticboolbool1;//false
staticMyClassmc1;//{0,'\0'}
}
如需全域靜態物件初始化的詳細資訊,請參閱main函式和命令列引數。
值初始化
在下列情況下,會發生值初始化:
使用空大括號初始設定初始化具名的值。
使用空括號或大括號初始化匿名暫存物件。
物件是以關鍵字加上空白括弧或大括弧初始化new
值初始化會執行下列作業:
對於至少有一個公用建構函式的類別,會呼叫預設建構函式。
對於沒有宣告建構函式的非等位類別,會將該物件初始化為零並呼叫預設建構函式。
對於陣列,會將每個元素初始化為值。
在所有其他情況下,會將變數初始化為零。
classBaseClass{
private:
intm_int;
};
intmain(){
BaseClassbc{};//classisinitialized
BaseClass*bc2=newBaseClass();//classisinitialized,m_intvalueis0
intint_arr[3]{};//valueofallmembersis0
inta{};//valueofais0
doubleb{};//valueofbis0.00000000000000000
}
複製初始化
複製初始化是使用不同的物件初始化同一個物件。
在下列情況下,會發生這類初始化:
使用等號初始化變數
將引數傳遞至函式
從函式傳回物件
擲回或攔截例外狀況
使用等號初始化非靜態資料成員
複製初始化會在彙總初始化期間初始化類別、結構和等位成員。
如需範例,請參閱匯總初始化。
下列程式碼示範數個複製初始化範例:
#include
直接初始化
直接初始化是使用(非空白)大括號或括號的初始化。
直接初始化可以叫用明確建構函式,這點與複製初始化不同。
在下列情況下,會發生這類初始化:
使用非空白大括號或括號初始化變數。
變數是以關鍵字加上非空白大括弧或括弧初始化new
使用初始化變數。
static_cast
在建構函式中,會使用初始設定式清單初始化基底類別和非靜態成員。
在Lambda運算式之所擷取變數的複本中。
下列程式碼示範一些直接初始化範例:
classBaseClass{
public:
BaseClass(intn):m_int(n){}//m_intisdirectinitialized
private:
intm_int;
};
classDerivedClass:publicBaseClass{
public:
//BaseClassandm_chararedirectinitialized
DerivedClass(intn,charc):BaseClass(n),m_char(c){}
private:
charm_char;
};
intmain(){
BaseClassbc1(5);
DerivedClassdc1{1,'c'};
BaseClass*bc2=newBaseClass(7);
BaseClassbc3=static_cast
在下列情況下,可以使用以大括號括住的初始設定式清單:
初始化變數
類別是使用new關鍵字初始化
從函式傳回物件
將引數傳遞至函式
直接初始化中的其中一個引數
在非靜態資料成員初始設定式中
在建構函式初始設定式清單中
下列程式碼示範一些清單初始化範例:
classMyClass{
public:
MyClass(intmyInt,charmyChar){}
private:
intm_int[]{3};
charm_char;
};
classMyClassConsumer{
public:
voidset_class(MyClassc){}
MyClassget_class(){returnMyClass{0,'\0'};}
};
structMyStruct{
intmy_int;
charmy_char;
MyClassmy_class;
};
intmain(){
MyClassmc1{1,'a'};
MyClass*mc2=newMyClass{2,'b'};
MyClassmc3={3,'c'};
MyClassConsumermcc;
mcc.set_class(MyClass{3,'c'});
mcc.set_class({4,'d'});
MyStructms1{1,'a',{2,'b'}};
}
彙總初始化
彙總初始化是陣列或類別類型(通常是結構或等位)的清單初始化表單,這些陣列或類別類型具有:
非private成員或protected成員
沒有使用者提供的建構函式(明確預設或已刪除的建構函式除外)
沒有基底類別
沒有虛擬成員函式
注意
在VisualStudio2015和更早版本中,不允許匯總具有非靜態成員的大括弧或等於初始化運算式。
此限制已在C++14標準中移除,並在VisualStudio2017中實作。
彙總初始設定式包含以大括號括住的初始化清單(包含或不含等號)(如下列範例所示):
#include
延伸文章資訊
- 1C 二維陣列如何初始化為0
這樣寫第一個元素初始化為0,其餘也會初始化為0還有一種就是. memset(要初始化的陣列, ... c++ 如何給double型二維陣列動態初始化. 8樓:xz巨集定義.
- 2陣列| C++與演算法
別忘了程式就是要協助人類解決大量重複的事情,當然有更好的方法可以用。 語法- 陣列宣告. 長度為 n 的陣列,可用資料為 [0] ~ ...
- 3在C 語言中將陣列初始化為0 | D棧- Delft Stack
cCopy char ZEROARRAY[1024] = {0};. 如果一個陣列被部分初始化,未初始化的元素將收到相關資料型別的值 0 。編譯器將用0 填充未寫入的元素。
- 4初始設定式
如何在C++ 中初始化類別、結構、陣列和基本類型。 ... 陣列、 POD 類別、結構及等位都會將其成員初始化為零值。 零初始化在不同時期執行:.
- 5第5章、陣列和指標 - C/C++
請以上述陣列mat[10][2]寫一個程式,只填入前五列初值,再以雙重迴圈輸出完整的陣列值,觀察後五列陣列值是否為0。 未定陣列大小初始化. 假定你想使用一個字串的陣列去 ...