2014-10-20 119 views
0

我知道這是一個相當簡單的問題,也取決於代碼的其餘部分,但我對經驗法則更感興趣。我應該在構造函數中調用成員函數

那麼在什麼情況下在構造函數中調用函數是合適的呢?

最好的是:

ClassA obj1; 
obj1.memFun(); 

ClassA obj1; 
//where constructor of ClassA is 
ClassA::ClassA(){ memFun(); } 
+2

取決於。如果'memfun()'被聲明爲'虛擬',你不應該這樣做。 – 2014-10-20 11:07:12

+0

如果您詳細說明memFun的功能,我們可以提供更具體的建議。例如,其邏輯可能適用於初始化列表。 – 2014-10-20 11:18:06

回答

4

這是沒有傷害到你的構造函數中調用一個成員函數。但是,確保成員函數是非虛擬的,因爲動態綁定機制在構造函數完成後啓動。如果memFun是虛擬的,並在其子類中重寫,然後調用memFun將結合ClassA::memFun

+0

這就是我想聽到:) – TheGuyWithStreetCred 2014-10-20 11:18:47

+0

@ user2202368接受答案? – 2014-10-20 11:20:18

+0

我打算這樣做 – TheGuyWithStreetCred 2014-10-20 11:22:31

4

一個構造函數的任務是有效的,可用的狀態,以創建一個對象。因此,如果需要您的函數調用來使對象的實例有效,請在構造函數中調用它。

不要在您的構造函數中調用virtual方法,但它可能會導致問題。

+0

謝謝,混淆了:) – TheGuyWithStreetCred 2014-10-20 11:19:10

+0

@nvoigt除了調用虛擬方法之外,還有其他問題嗎? – user2079303 2014-10-20 11:21:40

1

在構造函數中調用任何成員函數通常是安全的,因爲在執行第一行用戶代碼之前已經完全設置了對象。但是,在構造或銷燬期間,成員函數對抽象基類調用虛擬成員函數可能是不安全的。

http://msdn.microsoft.com/en-us/library/s8e39b8h.aspx

+0

謝謝,我會在處理繼承時避免這種情況 – TheGuyWithStreetCred 2014-10-20 11:19:56

1

如果memFun是虛擬的,你確實需要調用它的對象被完全建立,可以考慮使用一個工廠方法。例如:

static ClassA* makeX(){ 
    ClassA* pObj = new ClassX(); // ClassX is a subclass of ClassA. 
    pObj->memFun(); 
    return pObj ; 
} 

然後使ClassA和ClassX構造函數受到保護。

0

從概念上講,它可能不是最好在構造函數中調用public成員函數,因爲它暗示構造函數不僅僅是初始化和創建對象。然而,擁有私有成員函數應該沒問題,因爲它們不是該類的接口的一部分,並且可以被視爲構造函數的輔助函數。

相關問題