有關析構函數顯式調用的知識

析構函數一般不顯式調用,由系統自動調用,並且遵循先構造的後析構的原則,但是如果顯式的由“對象名.析構函數名”系統在執行該語句時只是把它當做類的普通成員函數,在遇到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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章