我有以下代碼析構函數和拷貝構造函數調用。(爲什麼它被調用在這些時間)
#include <iostream>
using namespace std;
class Object {
public:
Object(int id){
cout << "Construct(" << id << ")" << endl;
m_id = id;
}
Object(const Object& obj){
cout << "Copy-construct(" << obj.m_id << ")" << endl;
m_id = obj.m_id;
}
Object& operator=(const Object& obj){
cout << m_id << " = " << obj.m_id << endl;
m_id = obj.m_id;
return *this;
}
~Object(){
cout << "Destruct(" << m_id << ")" << endl;
}
private:
int m_id;
};
Object func(Object var) { return var; }
int main(){
Object v1(1);
cout << "(a)" << endl;
Object v2(2);
v2 = v1;
cout << "(b)" << endl;
Object v4 = v1;
Object *pv5;
pv5 = &v1;
pv5 = new Object(5);
cout << "(c)" << endl;
func(v1);
cout << "(d)" << endl;
delete pv5;
}
其輸出
Construct(1)
(a)
Construct(2)
2 = 1
(b)
Copy-construct(1)
Construct(5)
(c)
Copy-construct(1)
Copy-construct(1)
Destruct(1)
Destruct(1)
(d)
Destruct(5)
Destruct(1)
Destruct(1)
Destruct(1)
我有一些問題,爲此,首先爲什麼Object v4 = v1;
在打印(b)
後調用複製構造函數並生成Copy-construct(1)
。
而且之後的(c)
打印拷貝構造函數被再次調用兩次?我不是一定的此功能的工作原理來產生 Object func(Object var) { return var; }
和只是Destruct(1)
之後被調用(d)
在打印之前的兩倍。
對於長期的問題感到抱歉,我很困惑以上。
ahk非常感謝。還有一個問題,'Destruct(1)'的最後3個輸出是由於Object v1(1),v2 = v1,Object v4 = v1;'correct?和'Destruct(5)'是在之前被人爲刪除的? – silent 2010-06-06 07:20:01