建構函式與析構函式

2021-06-25 15:26:57 字數 2290 閱讀 1726

建構函式

先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決;建構函式的呼叫順序總是如下:

1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。

2.成員類物件建構函式。如果有多個成員類物件則建構函式的呼叫順序是物件在類中被宣告的順序,而不是它們出現在成員初始化表中的順序。

3.派生類建構函式。

析構函式

析構函式的呼叫順序與建構函式的呼叫順序正好相反,將上面3個點反過來用就可以了,首先呼叫派生類的析構函式;其次再呼叫成員類物件的析構函式;最後呼叫基類的析構函式。

析構函式在下邊3種情況時被呼叫:

1.物件生命週期結束,被銷毀時(一般類成員的指標變數與引用i都不自動呼叫析構函式);

2.delete指向物件的指標時,或delete指向物件的基類型別指標,而其基類析構函式是虛函式時;

3.物件i是物件o的成員,o的析構函式被呼叫時,物件i的析構函式也被呼叫。

下面用例子來說說建構函式的的呼叫順序:

#include "stdafx.h"

#include "iostream"

using namespace std;

class base

~base()

};class base1:public base

~base1()

};class derive

~derive()

};class derive1:public base1

~derive1()

};int _tmain(int argc, _tchar* argv)

執行結果是:

base::base()

base1::base1()

derive::derive()

derive1::derive1()

derive1::~derive1()

derive::~derive()

base1::~base1()

base::~base()

那麼根據上面的輸出結果,筆者稍微進行一下講解,建構函式的呼叫順序是;首先,如果存在基類,那麼先呼叫基類的建構函式,如果基類的建構函式中仍然存在基類,那麼程式會繼續進行向上查詢,直到找到它最早的基類進行初始化;如上例中類derive1,繼承於類base與base1;其次,如果所呼叫的類中定義的時候存在著物件被宣告,那麼在基類的構造函式呼叫完成以後,再呼叫物件的建構函式,如上例中在類derive1中宣告的物件derive m_derive;最後,將呼叫派生類的建構函式,如上例最後呼叫的是derive1類的建構函式。

virtual析構函式

下面來說一說為多型基類宣告virtual析構函式:

在c++中,建構函式不能聲時為虛函式,這是因為編譯器在構造物件時,必須知道確切型別,才能正確的生成物件,因此,不允許使用動態束定;其次,在建構函式執行之前,物件並不存在,無法使用指向此此物件的指標來呼叫建構函式,然而,析構函式是可以宣告為虛函式;c++明白指出,當derived class物件經由乙個base class指標被刪除,而該base class帶著乙個non-virtual析構函式,其結果未有定義---實際執行時通常發生的是物件的derived成分沒被銷毀掉。

看下面的例子:

class base

~base()

};class derive:public base

~derive()

};int _tmain(int argc, _tchar* argv)

輸出的結果是:

base::base()

derive::derive()

base::~base()

從上面的輸出結果可以看出,析構函式的呼叫結果是存在問題的,也就是說析構函式只作了區域性銷毀工作,這可能形成資源洩漏敗壞資料結構等問題;那麼解決此問題的方法很簡單,給base class乙個virtual析構函式;

class base

virtual ~base()

};class derive:public base

~derive()

};int _tmain(int argc, _tchar* argv)

輸出結果是:

base::base()

derive::derive()

derive::~derive()

base::~base()

可能上面的輸出結果正是我們所希望的吧,呵呵!由此還可以看出虛函式還是多型的基礎,在c++中沒有虛函式就無法實現多型特性;因為不宣告為虛函式就不能實現「動態聯編」,所以也就不能實現多型啦!

建構函式與析構函式

建構函式 主要作用就是為物件初始化。有一點要說的是,在繼承體系彙總,如果在建構函式中,如果沒有指定基類的建構函式,那麼編譯器會在建構函式開頭加入,基類的預設建構函式,這樣就可以初始化基類物件部分 析構函式 對於析構函式,要說的多點,實際也不太複雜,就是加入了virtual 使其具有了多型性質 inc...

建構函式與析構函式

概述 乙個類有兩種特殊的成員函式 建構函式與析構函式。建構函式功能是在建立物件時,給資料成員賦初值,即物件的初始化。析構函式的功能是釋放乙個物件,在物件刪除前,用它做一些記憶體釋放工作,與建構函式的功能相反。建構函式 在物件建立時它會被自動執行,因此變數 物件的初始化 一般都放在建構函式中。1 物件...

建構函式與析構函式

建構函式 建構函式與類同名,沒有返回型別,可過載 需要注意的是,在初始化物件時,呼叫的是其建構函式或拷貝建構函式,而不會呼叫賦值函式,這是因為賦值運算子是在乙個現存的物件被賦予新的值的時候才被呼叫,而拷貝建構函式在呼叫期間,這個物件還處於未決狀態 建構函式不能是虛函式,若是給建構函式加上virtua...