不要在建構函式以及析構函式中呼叫虛函式。
首先我們針對建構函式來說,對於乙個基類,建構函式中調虛函式,此時,如果該類被繼承,在派生類的建構函式會呼叫基類建構函式,在構造期間,多型機制尚未形成,虛函式呼叫可能不會呼叫派生類的虛函式,造成不明確的行為。對於析構函式道理一樣。見下面**:
class base
virtual void logdata() const = 0;
}class derived:public base
}
顯然在上面這段**裡我們可以明確的看出來,如果base()建構函式中,呼叫的是基類logdata 但是這個函式未定義 造成鏈結錯誤。 effective c 條款4解讀
條款4 確定物件使用前先被初始化 這裡的初始化主要包括三個方面的內容 1.對c 內建的型別進行手動的初始化。2.建構函式使用成員初始化列表來進行初始化。3.跨編譯單元的物件初始化順序,以local static 物件替換non local static 物件。建構函式使用成員初始化列表來進行初始化 ...
effective C 條款八解讀
別讓異常逃離析構函式 如果異常逃離析構函式,如果有class widgets,我們有vectord 如果d離開其作用域 並且widgets的析構函式丟擲異常,那麼就會連續的丟擲異常。導致程式結束和不明確行為,處理的方法最佳是提供乙個函式,讓使用者有機會去處理異常,如果使用者沒有處理該異常,那麼在析構...
effective C 條款十一解讀
在類的operator 中處理自我賦值的情況。在說這個主題之前,先考慮一下 class string private char pstr 顯然這一段 中如果this 與rhs指向的是同乙個物件,程式就會出現不明確的行為。解決自我賦值問題主要有三大方法 1.判斷是否是同乙個物件。2.在刪除自身資源前保...