2011-08-09 98 views
2

研究員堆垛,初始化數據成員引用++

考慮以下兩個簡單的類在頭文件:

Class CC 
{ 
public: 
CC(int& value); 
C& operator=(const C& other); 
{ 
    cout<<" From copy constructor "; 
} 

int m_cc; 
}; 

Class AA 
{ 
public: 
AA(CC& refCC); 

CC m_cInstance; 
} 

以下是在cpp文件。

CC:CC(int& value): m_cc(value) 
{ 
    cout<<" Constructor of CC" <<endl; 
    m_cc++; 
} 

AA:AA(CC& refCC): m_cInstance(refCC) 
{ 
    cout<<" The value of m_cc in refCC is: "<< refCC.m_cc; 
    cout<<" The address of m_cc in refCC is: "<< &refCC.m_cc; 
    cout<<" The address of refCC is: "<< &refCC; 

    cout<<" The value of m_cc in m_cInstance is: <<m_cInstance.m_cc; 
    cout<<" The address of m_cc in m_cInstance is: <<&m_cInstance.m_cc; 
    cout<<" The address of m_cInstance is: <<&m_cInstance; 
} 

我用上述兩個聲明中follwing方式的簡單類,在我的main.cpp文件:

INT cvalue = 1000; CC refCC(cvalue);

AA aaObj(refCC);

這裏是程序的輸出:

Constructor of CC 
The value of m_cc in refCC is: 1001 
The address of m_cc in refCC is: 0x12ff20 
The address of refCC is: 0x12ff20 

The value of m_cc in m_cInstance is: 1001 
The address of m_cc in m_cInstance is: 0x12ff14 
The address of m_cInstance is: 0x12ff14 

這裏有幾點看法:

  1. 注意,在實例AA m_cInstance的地址是從refCC的地址不同。

  2. 雖然CC的實例在AA的構造函數中通過引用(refCC)傳遞,但成員變量「m_cInstance」本身是單獨實例。當創建「refCC」 CC的即使兩個不同的實例中,實例CC的

  3. 構造被調用一次存在於程序攜帶相同的狀態。

  4. 被覆蓋的賦值運算符永遠不會被調用。

我的問題很簡單:

是如何「m_cInstance」在AA的構造而不會CC或CC定義的賦值操作符的構造函數的調用創建?

如果CC包含一個句柄作爲成員變量磁盤上的文件?它在「m_cInstance」中的行爲是什麼?

謝謝,

De Costo。

+0

1.你應該剪切和粘貼您的實際代碼的聲明。你的構造函數有語法錯誤。 2.'operator ='不是一個拷貝構造函數,它是一個賦值操作符。而且你是正確的,你的代碼永遠不會使用它。它使用拷貝構造,但是你沒有定義拷貝構造函數。 (CC)CC:CC(int&value):: m_cc(value)'應該像'CC :: CC(int&value):m_cc(value)'你在這裏輸入了代碼嗎? –

+0

「AA:AA(CC&refCC):m_cc(refCC)」行不會編譯,因爲在類「AA」中沒有成員「m_cc」。因此,您不會發布您詢問的代碼。詢問代碼X和郵政編碼Y是非常愚蠢的。 –

+0

@Chris:代碼已更正。 –

回答

2

m_cInstance使用(你的情況提供編譯器)拷貝構造函數創建。作爲一個全面的檢查,如果你需要定義賦值運算符,你可能需要定義拷貝構造函數和析構函數,以及(知道的三個hereon wikipedia規則)

+0

默認情況下爲類創建了什麼其他構造或方法?它是標準的一部分嗎? –

+1

見http://stackoverflow.com/questions/4172722,他們在那裏。是的,這是標準的。 – AProgrammer

0

你拷貝建設,創建m_cInstance所以它不會顯示你記錄。 m_cInstance使用refCC副本更新一次,即使refCC在實例外發生更改也不會更改。

0

有一個複製構造函數提供給你的類(由編譯器),如果我理解正確,你可能會混淆你已經用複製構造函數定義的operator=(const C& other)

對於class CC拷貝構造函數都會有有這樣

CC(const CC& C);