2010-02-11 154 views
4

這是我經常碰到的問題。下面的例子說明了它:初始化會員和成員

struct A { 
    int m_SomeNumber; 
}; 

struct B { 
    B(A & RequiredObject); 
private: 
    A & m_RequiredObject; 
}; 

struct C { 
    C(); 
private: 
    A m_ObjectA; 
    B m_ObjectB; 
}; 

C構造函數的實現看起來是這樣的:

C::C() 
: B(m_ObjectA) 
{ } 

由於初始化沒有定義,m_ObjectA可能未初始化的順序時m_ObjectB構造被調用,導致未定義的行爲。強制某種初始化順序的一種方法是在構造函數體中使成員指針和初始化它們,從而強制正確的順序,但由於多種原因,這很醜陋。有什麼辦法強制使用構造函數的初始化列表的某個初始化順序?如果沒有,你有任何其他建議如何處理這個問題。

回答

12

由於初始化順序沒有定義

相反,它是明確的。初始化的順序等於成員變量在你的類中被聲明的順序(並且不管初始化列表的實際順序如何!因此,讓初始化列表順序與聲明的順序相匹配是一個好主意避免討厭的驚喜)。

+0

好吧,我以爲不然。感謝你及時的答覆! – 2010-02-11 10:27:42

+1

我想補充一點,這是非常脆弱的,因爲您對訂購的依賴可能對讀者而言並不明顯。因此,至少我會爲m_objectB的定義添加註釋,以便「必須在m_objectA之後定義」的效果。 – peterchen 2010-02-11 10:28:51

+0

@peterchen:這就是爲什麼初始化列表的順序應該與聲明順序真正匹配的原因。 – 2010-02-11 10:29:57