2013-10-05 45 views
0

在網站中還沒有找到相當的這個問題。所以說,我有兩個班,一個持有其他參考:我可以使用其他類成員初始化初始化列表中的對象嗎?

class ClassA {}; 

class ClassB 
{ 
    classA & r_classA; 
    public: 
     ClassB(ClassA & io_classA):r_classA(io_classA){} 
}; 

所以,如果我想創建ClassB的實例,我必須把它傳遞給CLASSA引用在構造函數中:

int main() 
{ 
    ClassA classA; 
    ClassB classB (classA); 
    return 0; 
} 

現在說我創建一個類ClassC持有這兩種:

class ClassC 
{ 
    ClassA m_classA; 
    ClassB m_classB; 
    public: 
     ClassC(); 
} 

我的問題是,我可以指望m_classA正在創建初始化列表構造m_classB過嗎?也就是說,我可以這樣做:

ClassC::ClassC() 
: m_classA() 
, m_classB(m_classA) 
{} 

本標準是否符合標準?便攜式?我需要採取任何特殊的預防措施嗎?我已經在ClassC主體中的m_classB之前聲明瞭m_classA,並且編譯器沒有發出任何警告。該程序似乎工作正常。我只想檢查一下,我不指望會導致崩潰或怪異錯誤的不可靠行爲。

+2

在我看來,這是http://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order的重複。 – us2012

回答

4

類成員是按聲明的順序初始化的,所以你的代碼是定義明確的,並按照你的想法。

(編譯好應該提醒你,如果構造函數初始化列表的順序從聲明的順序不同,因爲這確實是錯誤的微妙源。但你的代碼確實是正確的。)

相關問題