01.03 C++學習大綱:析構函數


C++學習大綱:析構函數

C++ 析構函數

1. 定義

“~”

沒有參數和返回值類型的成員函數。

2. 調用

當對象消亡時,在系統收回它所佔的存儲空間之前,它的析構函數會自動被調用。

一般清空下不需要定義析構函數,但是,如果對象在創建後申請了一些資源並且沒有歸還這些資源,就要定義析構函數在對象消亡前歸還這些資源。

如果類中為提供析構函數,編譯程序會在需要時隱式提供一個析構函數,該析構函數負責調用成員對象類和基類的析構函數。

class A()

{

char *str;

public:

A()

{

str=NULL;

}

A(const char *p)

{

str = new char(strlen(p)+1);

strcpy(str,p);

}

~A()

{

delete []str;

str = NULL;

}

}

當包含成員對象的對象消亡時,先調用本身類的析構函數,本身類的析構函數的函數體執行完畢後,再調用成員函數對象類的析構函數(在繼承中,先調用和執行自己的析構函數,然後調用成員對象類的析構函數,最後調用基類的析構函數)。如果有多個成員對象,則成員對象析構函數的調用次序與它們定義的次序正好相反。

——————

C++學習大綱:析構函數

——————————

C++析構函數使用virtual的原因介紹

析構函數也可以是虛的,甚至是純虛的。但是構造函數不能是虛的。例如:

class A { public: virtual ~A()=0; // 純虛析構函數 };

類型需要虛析構函數的另外一個特徵是該類型具有指針成員或引用成員。如果有指針成員和引用成員,則該類型通常需要實現析構函數以及拷貝操作。通常,一個實現了析構函數的類型同時也需要實現拷貝構造函數與拷貝複製函數。

作為一個經驗法則:如果你有一個帶有虛函數功能的類,則它需要一個虛析構函數,原因如下:

1. 如果一個類有虛函數功能,它經常作為一個基類使用。

2.如果它是一個基類,它的派生類經常使用new來分配。

3.如果一個派生類對象使用new來分配,並且通過一個指向它的基類的指針來控制,那麼它經常通過一個指向它的基類的指針來刪除它(如果基類沒有虛析構函數,結果將是不確定的,實際發生時,派生類的析構函數永遠不會被調用)。基類有虛析構函數的話,最底層的派生類的析構函數最先被調用,然後各個基類的析構函數被調用。

<code>當一個類打算被用作其它類的基類時,它的析構函數必須是虛的。考慮下面的例子:
/<code>

class A { public: A() { ptra_ = new char[10];} ~A() { delete[] ptra_;} // 非虛析構函數 private: char * ptra_; }; class B: public A { public: B() { ptrb_ = new char[20];} ~B() { delete[] ptrb_;} private: char * ptrb_; }; void foo() { A * a = new B; delete a; }

<code>  在這個例子中,程序也許不會象你想象的那樣運行,在執行delete a的時候,實際上只有A::~A()被調用了,而B類的析構函數並沒有被調用!造成內存的洩漏,這是否有點兒可怕?
  如果將上面A::~A()改為virtual,就可以保證B::~B()也在delete a的時候被調用了。因此基類的析構函數都必須是virtual的。
/<code>


C++學習大綱:析構函數


通過分享實用的計算機編程語言乾貨,推動中國編程到2025年基本實現普及化,使編程變得全民皆知,最終實現中國編程之崛起,這裡是中國編程2025,感謝大家的支持。


分享到:


相關文章: