effective c 條款4解讀

2021-08-07 02:49:19 字數 1218 閱讀 9273

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

這裡的初始化主要包括三個方面的內容:

1.對c++內建的型別進行手動的初始化。

2.建構函式使用成員初始化列表來進行初始化。

3.跨編譯單元的物件初始化順序,以local static 物件替換non-local static 物件。

建構函式使用成員初始化列表來進行初始化

這裡需要注意不要在函式體內進行賦值操作,這樣的話程式會先呼叫一次預設建構函式再呼叫一次,賦值操作。初始化順序是先呼叫父類的建構函式,再以宣告的次順呼叫成員的建構函式,沒在初始化列表中明確構造的函式會呼叫其預設建構函式。

跨編譯單元的物件初始化順序,以local static 物件替換non-local static 物件。

首先明確non local static物件:global物件 定義在namespace 以及class 內 file作用域內的static物件

local static 物件:定義在函式內的static物件。

以一段**來闡述這乙個問題:

第乙個檔案:

class filesys

;extern filesys tfs;

第二個檔案:

class diectory

;directory::directory(param)

directory tempdir(params);

在這兩個檔案中都有乙個non local的static 物件,在tempdir的建構函式裡面呼叫了tfs的函式,但是我們並不知道現在tfs是否被初始化了,這樣就會造成不明確的行為。

正確的做法是利用乙個函式返回static物件,並且把non local static 物件替換為local static 物件,這樣只有在第一次呼叫函式時才會初始化物件,具體**見下面:

第乙個檔案:

class filesys

;filesys& filesys::tfs()

第二個檔案:

class diectory

;directory::directory(param)

directory tempdir(params);

這樣在呼叫函式的時候即使沒有初始化fs,也會首先初始化fs.

effective C 條款八解讀

別讓異常逃離析構函式 如果異常逃離析構函式,如果有class widgets,我們有vectord 如果d離開其作用域 並且widgets的析構函式丟擲異常,那麼就會連續的丟擲異常。導致程式結束和不明確行為,處理的方法最佳是提供乙個函式,讓使用者有機會去處理異常,如果使用者沒有處理該異常,那麼在析構...

effective C 條款九解讀

不要在建構函式以及析構函式中呼叫虛函式。首先我們針對建構函式來說,對於乙個基類,建構函式中調虛函式,此時,如果該類被繼承,在派生類的建構函式會呼叫基類建構函式,在構造期間,多型機制尚未形成,虛函式呼叫可能不會呼叫派生類的虛函式,造成不明確的行為。對於析構函式道理一樣。見下面 class base v...

effective C 條款十一解讀

在類的operator 中處理自我賦值的情況。在說這個主題之前,先考慮一下 class string private char pstr 顯然這一段 中如果this 與rhs指向的是同乙個物件,程式就會出現不明確的行為。解決自我賦值問題主要有三大方法 1.判斷是否是同乙個物件。2.在刪除自身資源前保...