2013-02-18 53 views
1

我想跟蹤給定類創建了多少個對象。如果我在類中重載operator ++,析構函數被調用,但我不知道爲什麼。更具體地講:C++操作符重載,析構函數被調用

class num{ 
public: 
    virtual void setValue(int)=0; 
    static int db; 
    num(){} 
    ~num(){} 
}; 

int num::db = 0; 

class int32: public num{ 
public: 
    // GET 
    int getValue(); 

    // SET 
    void setValue(int f); 

    // constructor 
    int32() 
    { 
     cout << "Construction..."<<endl; 
     this->value = 0;num::db++; 
    } 

    // destructor 
    ~int32() 
    { 
     cout << "destruction..."<<endl; 
     num::db--; 
    } 

    // operators 
    int32 operator++(int); 
    int32 operator++(void); 

protected: 
    int value; 
}; 

int32 int32::operator ++() 
{ 
    this->value++; 
    return *this; 
} 

int32 int32::operator ++(int) 
{ 
    this->value++; 
    return *this; 
} 

int main() 
{ 
    int32 i; 
    i.setValue(20); 

    cout << (i++).getValue()<<endl; 
    cout << (++i).getValue()<<endl; 

    cout << num::db; 

    cout << endl << "End of execution."; 
    return 1; 
} 

結果是: 建設... 破壞...... 破壞...... -1 結束execution.destruction的...

所以在++ i和i ++之後調用一個析構函數,但是爲什麼?

非常感謝!

+0

我認爲這是因爲該類的一個實例在'i ++'和'++ i'之前被複制,因爲它可以在其他地方分配。因爲你沒有分配它,它會被破壞。儘管我真的在吸食稻草,所以我很樂意看到答案。 – slugonamission 2013-02-18 10:23:55

+0

我建議你用cout實現複製構造函數,這應該指出你的理由。 – allen 2013-02-18 10:24:51

+1

不過我不認爲你會得到'++ i'和'i ++'的權利...... – phoeagon 2013-02-18 10:25:01

回答

2

這是因爲你返回副本。你會想創建一個複製構造函數

+0

我創建了一個增加num :: db的拷貝構造函數,現在它在最後包含正確的編號的執行。再次感謝! – 2013-02-18 10:46:00

1

您正在返回++運算符中對象的副本。

每次您撥打return *this您實際上都會創建一個傳遞給調用代碼的對象的副本。

0

這是因爲你的「operator ++()」方法都返回一個「int32」的副本。因此,對於每次調用,都會創建並返回一個新實例。