VC中析构函数的调用,高手请进!急~~

来源:百度知道 编辑:UC知道 时间:2024/06/06 16:27:37
以下是调用析购的例子。。。。关键请看注释部分请看,我不理解的是为什么这里调用了两次析构函数,请详细说明一下,感谢。。。

#include <iostream.h>

class MyClass
{
private:
int val;
public:
MyClass(int i=0){ val=i;cout<<"Iam is here"<<endl;}
MyClass(MyClass & cp);
void set(int i);
void print();
~MyClass();
};

MyClass::MyClass(MyClass &cp)
{
val=cp.val;
cout<<"hi.val="<<val<<endl;
}

void MyClass::set(int i)
{
val=i;
}
void MyClass::print()
{
cout<<"This Print val="<<val<<endl;
}

MyClass::~MyClass()
{
cout<<"destructor for val"<<val<<endl;
}

MyClass MyFun(MyClass);
void gFun();

void main()
{
gFun();
cout<<"Exiting main"<<endl;

}

void gFun()
{
MyClass my(5),ret;

obj是一个局部变量,因此在函数末端就被销毁了,无法在把值传回,所以实际上将值返回给ret是用一个临时创建的对象执行的,并且在这个返回过程中是一个赋值行为.这个过程相当于这样:
MyClass temp = obj;
ret = temp;
最后temp和obj都会销毁,这就是为什么你会看到有两个析构函数执行,并且结果输出结果是10和9
我想你ret也应该是9吧
如果你返回值为引用或者指针,就不会出现这种情况了,不过如果你返回指针你得考虑返回的是否是一个空悬指针.

MyFun函数是复制了一个my 在函数结束后被析构掉了 可以理解为OBJ被析构掉了
这个过程中调用了2次构造函数 因为MY构造的时候是用MyClass(int i=0)这个构造函数
但是OBJ构造的时候用的是MyClass(MyClass & cp);
这个构造函数
所以析构OBJ的时候需要析构2次~

MyClass MyFun(MyClass &obj) //这里 改成引用方式
{
......
}

参数传递时,有一个复制的过程,产生一个临时对象。所以,析构的时候调用两次。

对象值确是一样的 但不是同个对象
这样的
ret=MyFun(my); /*我不理解的是为什么这里调用了两次析构函数*/
这是值传,那么my要建立临时对象,在return的时候destruct
然后,这不是拷贝构造 而是赋值表达式,ret被赋值的时候 MyFun的返回值暂存在动态内存,也要需要释放,事实上是先赋值给ret再释放。在释放的时候自动调用析构destruct。
所以,两次析构
over