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

2022-07-29 02:51:14 字數 1669 閱讀 4307

記住:永遠在使用物件前先將它初始化。

1、不要混淆賦值assignment和初始化initialization。

abentry::abentry(const std::string& name,const std::string& address,const std::list&phones)//版本1

abentry::abentry(

const std::string& name,const std::string& address,const std::list&phones)//版本2

:thename(name),

//呼叫thename的預設建構函式

theaddress (address),//

下面也是一樣操作

thephones (phones),

numtimesconsulted (0)

記住如果沒有在建構函式的初始化成員列表中顯式地初始化成員,則該成員將在建構函式體之前執行預設初始化,比如說上面第乙個,在進行賦值之前,thename會呼叫預設建構函式執行初始化操作。

初始化和賦值的區別事關底層效率問題,前面直接使用拷貝建構函式進行初始化,後者則先預設初始化然後才呼叫拷貝賦值運算子進行賦值。

拷貝建構函式的概念:如果建構函式的第乙個引數是自身類型別的引用,且任何額外的引數都有預設值,則該建構函式就是拷貝建構函式。

如果成員變數是const或references,它們就一定需要初值,不能被賦值。

c++有著十分固定的成員初始化順序。基類早於派生類被初始化,而class的成員變數總是以其宣告次序被初始化。

2、local static物件替換non-local static物件

函式內的static物件稱為local static物件(因為它們對函式而言是local),其他static物件稱為non-local static物件。

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

c++對定義於不同編譯單元內的non-local static物件的初始化次序並無明確的定義。

class

filesystem;

extern filesystem tfs;//其他檔案定義,呼叫就行

class

directory;

directory::directory(

params

)

現在建立乙個directory物件:

directory tempdir(params);

上面的例子初始化順序就很重要,如果tempdir在使用tfs之前,tfs還沒有被初始化,那麼就會出問題。

為了解決這個問題,可以使用單例模式:把非區域性靜態變數封裝到函式中,並返回乙個對該變數的引用。

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

class

filesystem;

filesystem& tfs()

class

directory;

directory::directory(

params

)directory&tempdir()

總結:

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

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

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

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

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

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