2013-06-19 39 views
0

這個問題是關於類對象的按位複製。 爲什麼不調用構造函數,而是在下面的代碼中調用析構函數? 輸出爲對象失敗的C++按位副本?爲什麼?

HowMany h2 = f(h); //沒有構造得到; S這裏叫做..

after construction of h: objectCount = 1 
x argument inside f(): objectCount = 1 
~HowMany(): objectCount = 0 
after call to f(): objectCount = 0 
~HowMany(): objectCount = -1 
~HowMany(): objectCount = -2 




class HowMany { 
    static int objectCount; 
public: 
    HowMany() { objectCount++; } 
    static void print(const string& msg = "") { 
     if(msg.size() != 0) cout << msg << ": "; 
     cout << "objectCount = " 
      << objectCount << endl; 
    } 
    ~HowMany() { 
     objectCount--; 
     print("~HowMany()"); 
    } 
}; 

int HowMany::objectCount = 0; 
// Pass and return BY VALUE: 

HowMany f(HowMany x) { 
    x.print("x argument inside f()"); 
    return x; 
} 

int main() { 
    HowMany h; 
    HowMany::print("after construction of h"); 
    HowMany h2 = f(h); 
    HowMany::print("after call to f()"); 
} ///:~ 

回答

6

首先,C++沒有「按位複製」。默認複製機制由編譯器提供複製構造函數實現。編譯器提供的複製構造函數通過調用每個數據成員的特定複製語義遞歸地複製每個數據成員。在某些情況下,最終結果可能會看起來像是「按位複製」,但語言不會使用這樣的低級概念。

其次,在這種情況下調用的構造函數是,複製構造函數。它的簽名是

HowMany::HowMany(const HowMany&) 

此構造是由編譯器提供,它的確是叫,但你根本不計算它。這就是爲什麼你的objectCount計數器顯示不平衡的結果。

2

因爲副本constriuctor丟失。 必須在拷貝構造函數遞增以及

加入這一行太

HowMany(const HowMany& r) { objectCount++; } 
+0

感謝Bash.d的更正 –

1

您遇到的問題,在你的函數f()拷貝構造函數被調用,這是不正常的構造函數。當函數超出作用域時,析構函數將被調用。 提供像

HowMany::HowMany(const HowMany& other){ 
objectCount++; 
} 

複製構造函數,這將工作。

0

嘗試爲HowMany創建一個拷貝構造函數。默認情況下,編譯器會爲你創建一個拷貝構造函數,你不會覺得它會被調用。

相關問題