浅析:类只能有一个析构函数

类的构造函数与析构函数都是与类同名(析构函数需要加上'~'),没有返回值的;而构造函数是可以有参数的,但是析构函数是不能有参数的。

我们知道类可以有多个构造函数,这些构造函数是重载函数的关系,也就是说函数名都是相同的,区别它们主要靠参数的不同(参数个数和参数类型)。

但是由于析构函数是没有参数的,那么从而无法通过参数的不同来达到重载多个析构函数的目的,从而析构函数只能有一个。

析构函数是由系统负责调用的,也可以手工显示调用,但是显示调用析构函数是不会析构该对象的,也就是说显示调用析构函数和没有显示调用析构函数是一样的,

#include<iostream>
using namespace std;
class A
{
public:
   A(){};
   void fun() {cout<<"The object exists!";};
   ~A(){};

  int bbb;
};
int main()
{
   A *a=new A();

  a->bbb=345;
   a->~A();//显示调用析构函数后,对象a还存在吗?
   a->fun();
   //编译运行后a->fun()能够输出,对象a仍存在
   return 0;

再来看看汇编代码

在VC的DEBUG模式下,通过查看反汇编代码,可以看到,直接调用析构函数的语句没有任何汇编代码对应它,就和没有这一语句一模一样.由此看来,析构函数是自动调用的,如果显示调用是不会析构对象的。
……
14:       a->bbb = 345;
0040105B   mov         ecx,dword ptr [ebp-4]
0040105E   mov         dword ptr [ecx],159h
15:       a->~A();
16:       a->fun();
00401064   mov         ecx,dword ptr [ebp-4]
00401067   call        @ILT+15(A::fun) (00401014)
……

由以上可知,一个类只能有一个析构函数,析构函数没有返回值没有参数,只能由系统调用时才析构对象。

猜你喜欢

转载自blog.csdn.net/ZHUJIANWEILI4/article/details/44804573
今日推荐