讀取未初始化的值會導致不明確的行為。
在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...