條款4 確認物件在被使用前已被初始化

2021-09-06 23:30:04 字數 1628 閱讀 6911

1。最佳的處理方式是:永遠在使用物件之前先將它初始化。對於無任何成員的內建型別,你必須手動完成此事。至於內建型別以外的任何其他東西,初始化的責任落在建構函式身上:確保每乙個建構函式都將物件的每乙個成員初始化。但是別混淆了賦值喝初始化。

2.建構函式的乙個較佳寫法是,使用所謂的member initialization list 替換賦值動作。這樣效率較高。因為處置列中針對各個成員變數而設的實參,被拿去作為各成員變數之建構函式的實參。單次呼叫一次copy建構函式。

3.總是在初值列中列出所有成員變數,以免還記得哪些成員變數可以無需初值。

4.如果成員變數是const或者reference,它們就一定需要初值,不能被賦值。最簡單的做法是:使用成員初值列,這樣做有時是必要的,且往往比賦值高效。

5.c++有著十分固定的「成員初始化次序」。base classes更早於其derived claseed被初始化,而class的成員變數總是以其宣告次序被初始化。所以整好順序,不然可能會有記憶體洩漏。

6.不同編譯單元內定義之non-local static 物件。

6.1 static物件,其壽命從被構造出來直到程式結束為止,因此stack 和heap-based物件都被排除。這種物件包括global物件,定義於namespace作用域內的物件,在classes內,在函式內,已經在file 作用域內宣告為static的物件。函式內的static 物件被稱為local static物件,其他的static物件稱為non-local static物件。程式結束時static物件被自動銷毀,也就是它們的析構函式會在mian()時被自動呼叫。

6.2所謂編譯單元,是指產出單一目標檔案的那些原始碼。基本上它是單一原始碼檔案加上其所含入的標頭檔案。

6.3c++對「定義於不同編譯單元內的non-local static物件」的初始化次序並無明確定義。決定它們的初始化次序相當困難,無解。但是乙個小小的設計可以完全消除這個問題那就是!!!!將每個non-local static物件搬到自己的專屬函式內。non-local static object 被 local static object替換了。

6.4 c++保證,函式內的local static 物件會在該函式被呼叫期間,首次遇上該物件之定義式時被初始化:

原函式:

class filesystem; extern filesystem tfs; class directory; directory::directory(params) directory tempdir(params);

改為:class filesystem; //同前 filesystem& tfs() class directory; directory::directory(params) directory& tempdir()

但是在多執行緒環境下「等待某事發生」都會有麻煩,處理這個麻煩的一種做法是:在程式的單執行緒啟動階段,手工呼叫所有reference-returnning 函式,這可消除與初始化有關的"競速形勢"。

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

建構函式最好使用成員初值列,而不要在建構函式內使用賦值操作。初值列列出的成員變數,其排列次序應該和他們在class中的宣告次序相同。(注意存在相互依存的成員變數的順序)。

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

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

規則 內建型別,必須手工完成初始化。int x 0 const char p text a c style string 內建型別以外的其他東西,在建構函式內初始化 確保每乙個建構函式都將物件的每乙個成員初始化。但要分清賦值和初始化 下面的例子是賦值,不是初始化 class phonenumber ...

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

記住 永遠在使用物件前先將它初始化。1 不要混淆賦值assignment和初始化initialization。abentry abentry const std string name,const std string address,const std list phones 版本1 abentr...

4 確定物件在使用前已被初始化

一 盡量使用成員初始化的方式初始化成員 c 規定成員初始化發生早於建構函式,建構函式最好使用成員初值列,而不要在建構函式中使用賦值操作。初值列中的成員變數的初始化順序是根據這些成員變數宣告的順序進行初始化的,所以為了保證一致性,成員初值列中的順序最好跟宣告順序一致。二 為避免 跨編譯單元的初始化先後...