2016-04-25 74 views
1
#include<iostream> 
using namespace std; 
class Monster { 

    public: 
    Monster() {cout << "with out argument. \n";} 
    Monster(int sz) { cout << "Monster created.\n"; } 
    ~Monster() { cout << "Monster destroyed.\n"; } 

    int GetSize() { return itsSize; } 
    void SetSize(int str) { itsSize = str; } 

private: 
    int itsSize; 
}; 

int main() 
{ 
    Monster *m; 
    m =new Monster[3]; 
    for(int i = 0; i < 3; i++) 
    m[i] = i; // constructor with argument is getting called for each elements after which why destructor is getting called for each element.   
    delete []m; 
    return 0; 
} 

Output: 
with out argument. 
with out argument. 
with out argument. 
Monster created. // Monster constructor with argument is getting called. 
Monster destroyed. // 1. Why this destructor is getting called after each call of constructor. 
Monster created. 
Monster destroyed. //2. 
Monster created. 
Monster destroyed. //3. 
Monster destroyed. 
Monster destroyed. 
Monster destroyed. 

當我初始化具有值的怪物對象數組時,參數化構造函數被調用,之後立即爲什麼析構函數被調用?如何調用破壞函數?

+1

您應該註釋副本並移動構造函數(和賦值)以獲得更清晰的圖像。他們會讓你更好地瞭解臨時代碼等等。 – Niall

+0

'm [i] = i;'你將整數存入指針數組中,這真的是你想要的嗎? –

+0

下面是一個「嘈雜」怪物的例子... http://coliru.stacked-crooked.com/a/b8456e3bec85d185 – Niall

回答

6
m =new Monster[3]; 

這裏創建了三個對象,每個對象都被調用了默認構造函數。這就是爲什麼你看到通過使用Monster(int)構造消息with out argument.

m[i] = i; 

首先,臨時怪物是在右手邊創建。這就是爲什麼你看到消息Monster created.接下來,調用操作符被調用。接下來,你的臨時怪物被刪除。這就是爲什麼你看到Monster destroyed.

delete []m; 

數組中的三個怪物被破壞。


爲了更好地理解這種情況下,我建議你的this到所有郵件添加地址。

+0

打敗我。 ;)[現場演示](http://ideone.com/jeKMZZ)構建的臨時對象被移動分配到您的數組中,但臨時本身仍然被銷燬。移動分配不會移動對象本身,而只是移動它的資源所有權。 –