我知道這是一個相當簡單的問題,也取決於代碼的其餘部分,但我對經驗法則更感興趣。我應該在構造函數中調用成員函數
那麼在什麼情況下在構造函數中調用函數是合適的呢?
最好的是:
ClassA obj1;
obj1.memFun();
或
ClassA obj1;
//where constructor of ClassA is
ClassA::ClassA(){ memFun(); }
我知道這是一個相當簡單的問題,也取決於代碼的其餘部分,但我對經驗法則更感興趣。我應該在構造函數中調用成員函數
那麼在什麼情況下在構造函數中調用函數是合適的呢?
最好的是:
ClassA obj1;
obj1.memFun();
或
ClassA obj1;
//where constructor of ClassA is
ClassA::ClassA(){ memFun(); }
這是沒有傷害到你的構造函數中調用一個成員函數。但是,確保成員函數是非虛擬的,因爲動態綁定機制在構造函數完成後啓動。如果memFun
是虛擬的,並在其子類中重寫,然後調用memFun
將結合ClassA::memFun
這就是我想聽到:) – TheGuyWithStreetCred 2014-10-20 11:18:47
@ user2202368接受答案? – 2014-10-20 11:20:18
我打算這樣做 – TheGuyWithStreetCred 2014-10-20 11:22:31
一個構造函數的任務是有效的,可用的狀態,以創建一個對象。因此,如果需要您的函數調用來使對象的實例有效,請在構造函數中調用它。
不要在您的構造函數中調用virtual
方法,但它可能會導致問題。
謝謝,混淆了:) – TheGuyWithStreetCred 2014-10-20 11:19:10
@nvoigt除了調用虛擬方法之外,還有其他問題嗎? – user2079303 2014-10-20 11:21:40
在構造函數中調用任何成員函數通常是安全的,因爲在執行第一行用戶代碼之前已經完全設置了對象。但是,在構造或銷燬期間,成員函數對抽象基類調用虛擬成員函數可能是不安全的。
謝謝,我會在處理繼承時避免這種情況 – TheGuyWithStreetCred 2014-10-20 11:19:56
如果memFun
是虛擬的,你確實需要調用它的對象被完全建立,可以考慮使用一個工廠方法。例如:
static ClassA* makeX(){
ClassA* pObj = new ClassX(); // ClassX is a subclass of ClassA.
pObj->memFun();
return pObj ;
}
然後使ClassA和ClassX構造函數受到保護。
從概念上講,它可能不是最好在構造函數中調用public成員函數,因爲它暗示構造函數不僅僅是初始化和創建對象。然而,擁有私有成員函數應該沒問題,因爲它們不是該類的接口的一部分,並且可以被視爲構造函數的輔助函數。
取決於。如果'memfun()'被聲明爲'虛擬',你不應該這樣做。 – 2014-10-20 11:07:12
如果您詳細說明memFun的功能,我們可以提供更具體的建議。例如,其邏輯可能適用於初始化列表。 – 2014-10-20 11:18:06