條款04 確定物件被使用之前先被初始化

2021-09-11 12:07:34 字數 2198 閱讀 7265

讀取未初始化的值會導致不明確的行為。

在c++中,規則很簡單:確保每乙個建構函式都將物件的每乙個成員初始化。

class phonenumber;

class abentry;

abentry::abentry(const std::string& name, const std::strings& address,

const std::list& phones)

這種操作會導致abentry物件帶有你指定的值,但不是最佳做法。在abentry建構函式內,thename,theaddress,thephones都不是被初始化,而是被賦值。abentry建構函式的乙個較佳寫法是,使用成員列初始列替換賦值動作。

abentry::abetry(const std::string& name, const std::string& address, 

const std::list& phones)

:thename(name), //這些都是初始化

theaddress(address),

thephone(phones),

numtimesconsulted(0)

{}

甚至當你default構造乙個成員變數,你都可以使用成員初值列,只要指定無物作為初始化實參即可。

abentry::abetry()

:thename(),

theaddress(),

thephone(),

numtimesconsulted(0) //初始化numtimesconsulted

{}

記住乙個規則:規定總是在初始值列中列出所有成員變數,以免還得記住哪些成員變數(如果它們在初值列中被遺漏的話)可以無需賦值。

許多class擁有多個建構函式,每個建構函式都有自己的成員初始列。這種情況可以合理的遺漏哪些」賦值和初始化變現一樣好」的成員變數,改用它們的賦值操作,並將哪些賦值操作移往某個函式(通常是private),共所有構造函式呼叫。

c++有著固定的成員初始化次序。基模擬派生類先初始化,class的成員變數總是以其宣告的順序被初始化。

所謂static物件,其壽命從構造出來知道程式結束為止。函式內的static物件稱為local static物件(因為它們對於函式而言是local),其他static稱為non-static物件。程式結束時static物件會自動銷毀,也就是它們的析構函式會在main()結束時被自動呼叫。

當兩個原始檔都至少含有乙個non-static的物件。如果某編譯單元內的non-local static物件的初始化使用了麼另乙個non-local static物件,它所用的這個物件可能尚未被初始化,因為c++對"定義於不同編譯單元內的non-static 物件"的初始化次序並無明確定義。

例:

class filesystem                //來自你的程式庫

;extern filesystem tfs; //預備給客戶使用的物件

class director            //客戶的程式庫

;director::directory(params)

directory tempdir(params);  //為臨時檔案而做出的目錄
除非tfs在tempdir之前被初始化。

解決辦法:這個辦法的基礎在於:c++保證函式local static物件在「該函式呼叫期間」「首次遇上該物件的定義」時被初始化。

class filesystem

filesystem& tfs()

class directory;

directory::directory(params)

directory& tempdis()

結論:為內建型別物件進行手工初始化,因為c++不保證初始化它們。

建構函式最好使用成員初始列,而不要在本體內使用賦值操作。初始列列出的成員變數,其排列次序應該和它們在class宣告次序相同。

為避免「跨編譯單元初始化次序」問題,請以local static物件替換non-local static 物件。

條款04 確定物件被使用前已先被初始化

總結 1.為內建型物件進行手工初始化,因為c 不保證初始化它們。2.建構函式最好使用成員初值列 memberinitialization list 而不要在建構函式本體內使用賦值操作 assignment 初值列列出的成員變數,其排列次序應該和它們在class中的宣告次序相同。3.為免除 跨編譯單元...

條款04 確定物件被使用前已先被初始化

讀取未初始化的值會導致不明確的行為,使程式終止或者行為不可 最佳的處理方法是 永遠在使用物件之前先將它初始化。在初始化時,有以下注意事項 對內建型別,需要手工完成初始化。對其他型別,確保建構函式都將物件的每乙個成員初始化。規定總是在初值列表中列出所有的成員變數,以免需要區分哪些成員變數無需初值。成員...

條款04 確定物件被使用前已先被初始化

條款04 確定物件被使用前已被初始化 include include include using std string using std cout using std endl using std list class point04 1.不要混淆了賦值 assignment 和初始化 initi...