2013-11-26 127 views
1

我的代碼是爲什麼析構函數被調用兩次,但構造函數只有一次?

class CTemp{ 
public: 
    CTemp(){ 
     printf("\nIn cons"); 
    } 
    ~CTemp(){ 
     printf("\nIn dest"); 
    } 
}; 

void Dowork(CTemp obj) 
{ 
    printf("\nDo work"); 
} 

int main() 
{ 
    CTemp * obj = new CTemp(); 
    Dowork(*obj); 
    delete obj; 
    return 0; 
} 

,我得到的是

In cons 
Do work 
In dest 
In dest 

現在爲什麼構造函數被調用一次的輸出,但析構函數被調用兩次?有人可以解釋這個嗎?

回答

6
void Dowork(CTemp obj) 

這裏的本地副本將完成,這將是從DoWork功能的範圍退出後毀滅,這就是爲什麼你看到的析構函數調用。

+0

是的。工作應該採用'const CTemp&'。 –

+0

所以這意味着在這種情況下複製構造函數被調用? – singh

+0

@singh是的。默認實現的複製c-tor將被調用。 – ForEveR

2

實現一個拷貝構造函數,並再次檢查:通過使用隱式的拷貝構造函數

CTemp(const CTemp& rhs){ 
     printf("\nIn copy cons"); 
    } 
0

當函數被調用的參數被創建。添加到您的類以下的拷貝構造函數

CTemp(const CTemp &){ 
    printf("\nIn ccons"); 
} 

看到有關創建

0

你已經錯過了以計數拷貝構造和預期的構造函數,而不是一個對象多了一個消息。

CTemp * obj = new CTemp(); // It will call a constructor to make 
          // a pointer to a constructed object. 

Dowork(*obj);    // It will copy `*obj` to the `Dowork` and copy- 
          // constructor will be called to make the argument 

所以,你有兩個對象和兩個析構函數會被調用。

相關問題