條款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.在刪除自身資源前保...