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

析构函数一般不显式调用,由系统自动调用,并且遵循先构造的后析构的原则,但是如果显式的由“对象名.析构函数名”系统在执行该语句时只是把它当做类的普通成员函数,在遇到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;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值