有关析构函数显式调用的知识

析构函数一般不显式调用,由系统自动调用,并且遵循先构造的后析构的原则,但是如果显式的由“对象名.析构函数名”系统在执行该语句时只是把它当做类的普通成员函数,在遇到return语句时任会隐式的调用析构函数,这样已经被销毁的数据再一次被销毁,并且可以通过编译器,以下是一个完整的例子:

#include<iostream>
using namespace std;
class CBase1
{
int x ;
public:
CBase1( )
{x=0 ; cout<<"调用构造函数CBase1( )!\n";}
CBase1( int a)
{x=1;cout<<"调用构造函数CBase1( int )!\n";}
~CBase1( ){cout<<"调用析构函数~CBase1( )!\n";}
};
class CBase2
{
int y;
public:
CBase2( )
{y=0 ;cout<<"调用构造函数CBase2( )!\n";}
CBase2(int a)
{y=a ;cout<<"调用构造函数CBase2(int )!\n";}
~CBase2(){cout<<"调用析造函数~CBase2( )!\n";}
};
class A
{
int x;
public:
A () {x=0 ; cout<<"调用构造函数A( )!\n";}
A(int a){x=a;cout<<"调用构造函数A(int )!\n";}
~A(){cout<<"调用析构函数~A()!\n";}
};
class CDerived:public CBase1, virtual public CBase2
{
A a;
public:
CDerived()
{cout<<"调用构造函数CDerived( )!\n";}
CDerived(int x,int y ,int z):a(x),CBase1(y),CBase2(z)
{cout<<"调用构造函数CDerived(int,int )!\n";}
~CDerived(){cout<<"调用析造函数~CDerived( )!\n";}
};
int main()
{
 
 CDerived *d=new CDerived();
    
  
   CDerived *dd=new CDerived(3,3,3);
   delete d;    //该语句实际是两条语句,delete d和~CDerived( ).
  //d->~CDerived则是单纯的执行一条普通的成员函数,在遇到return后再一次执行析构函数

   cout<<"main()函数结束!"<<endl;
   delete dd;
  
  
  
   return 0;

}

 

 

发布了57 篇原创文章 · 获赞 8 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章