我的代码是
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
现在为什么构造函数被调用一次但析构函数被调用两次?有人可以解释一下吗?
答案 0 :(得分:6)
void Dowork(CTemp obj)
这里将完成local-copy,在退出DoWork
函数范围后将会破坏,这就是你看到析构函数调用的原因。
答案 1 :(得分:2)
实现复制构造函数并再次检查:
CTemp(const CTemp& rhs){
printf("\nIn copy cons");
}
答案 2 :(得分:0)
调用该函数时,使用隐式复制构造函数创建其参数。向您的类添加以下复制构造函数
CTemp( const CTemp & ){
printf("\nIn ccons");
}
再看一条关于创建对象的消息
答案 3 :(得分: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
所以,你有两个对象,将会调用两个析构函数。