2014-04-14 234 views
2

我有一個下面的代碼。每次調用構造函數時,我都會增加一個計數器,並且每次調用析構函數時計數器都會減少。在實例化三個類對象之後,我嘗試打印出計數器值。然後,我試着在刪除其中一個對象後再次打印出計數器值。期望的值是4和3,但是我得到2和1.C++類構造函數/析構函數

我實際上已經嘗試在構造函數和析構函數中打印出一些內容來觀察它們被實際調用了多少次,但令人驚訝的是另外還調用了Destructor幾次到我稱之爲「刪除對象」的時候。是否因爲析構函數被自動調用?如果是這樣,有什麼辦法可以關閉該功能來測試我的代碼?

**代碼最初在類中有Add和Mult函數,但我在此省略,因爲這裏函數的細節看起來不相關。

#include <iostream> 
using namespace std; 

class Complex{ 
    private: 
    double x, y; 
    static int count; 

Complex Add(Complex como) 
{ 
    Complex t; 
    t.x=x+como.x; 
    t.y=y+como.y; 
    return t; 
} 
Complex Mul(Complex como) 
{ 
    Complex t; 
    t.x=(x*como.x)-(y*como.y); 
    t.y=(y*como.x)+(x*como.y); 
    return t; 
} 
public: 
    Complex(double a=0, double b=0) : x(a), y(b) {count++;} 
    ~Complex() {count--;} 
    void Print() {cout << "(" << x << ", " << y << ")" << endl;} 
    static int GetCount() {return count;} 
}; 

int Complex::count=0; 



int main() 
{ 
    Complex com1(1.0, 2.0), com2(3.0, 4.0); 
    Complex com3; 

    com1.Print(); cout << endl; 
    com2.Print(); cout << endl; 

    com3 = com1.Add(com2); com3.Print(); cout << endl; 

    Complex *pcom4 = new Complex; 
    *pcom4 = com1.Mul(com2); pcom4->Print(); cout << endl; 

    cout << "#complex numbers = " << com1.GetCount() << endl; 
    delete pcom4; 
    cout << "#complex numbers = " << com1.GetCount() << endl; 
    return 0; 
} 
+1

您不顯示Mul和Add的定義,請複製它們的參數? –

+0

我只是假設'Add'和'Mul'的參數不是*引用(任何類似的)。 – WhozCraig

+0

對不起,我剛添加了定義! – pandagrammer

回答

4

在C++中,你可以構造三種方式對象:使用使用使用 「移動構造」 「複製構造函數」

  • 的 「構造」
    1. 如果不定義它們,編譯器會自動爲您編寫代碼(除非您明確禁止它)。

      您的方法MulAdd正在接受另一個複數值,這意味着將使用複製構造函數調用來複制該調用的參數。 自動合成的拷貝構造函數不增加計數器。

  • 2

    您的方法將Complex對象作爲參數(不是對現有對象的引用),因此每個調用都會創建新對象,並在調用結束時被銷燬。

    +0

    錯了。僅當沒有用戶聲明的構造函數時纔會生成默認(「no args」)構造函數。請參閱http://stackoverflow.com/a/4944131/2192139這裏編譯器生成的是拷貝構造函數,它接受一個參數。 – Geier

    +1

    @Geier足夠。我沒有關於我的語言規範。那麼'Complex com3;'上面發生了什麼? – John3136

    +1

    有*是*無參數構造函數。它恰好是一個完整填充了默認參數的參數。 * not *遞增count是隱式*拷貝構造函數*,它由參數輸入觸發,但同一個*析構函數*(duh)在* all *個案中被複制(複製構造或其他) 。 – WhozCraig