C 建構函式析構函式呼叫順序

2021-10-08 22:01:35 字數 1377 閱讀 5500

在使用建構函式和析構函式時,需要特別注意對它們的呼叫時間和呼叫順序。在一般情況下,呼叫析構函式的次序正好與呼叫建構函式的次序相反:最先被呼叫的建構函式,其對應的(同一物件中的)析構函式最後被呼叫,而最後被呼叫的建構函式,其對應的析構函式最先被呼叫。

簡單來說,其建構函式的順序就一句話:

基類建構函式 -> 成員的建構函式 -> 建構函式體內語句

eg.

#include

using

namespace std;

classa~

a()}

;classb~

b()}

;classc~

c()}

;classd~

d()}

;classe:

public b,

public a ~e

()};

intmain()

首先應該執行的是基類的建構函式。不過 c++ 語言是支援多繼承的,那麼當某個類繼承多個類時,其構造順序又是怎樣的呢?答案是:簡單的依照繼承的順序構造。

接下來,就會執行其成員變數的建構函式,這個順序也很簡單,就是依照類**中成員變數的順序依次執行的。

最後才會執行建構函式中的具體**。

注意,在上述過程中,執行的順序與構造函式引數的順序無關。

通過 new 建立乙個物件會呼叫其建構函式,通過 delete 刪除乙個物件會呼叫其析構函式。

如果沒有顯示的使用 delete 刪除乙個物件的話,析構函式執行的順序與建構函式的順序相反。

所以,上述**的輸出就是:

b(5

)a()

d()c

(3)e

()~e

()~c

()~d

()~a

()~b

()

下面歸納一下什麼時候呼叫建構函式和析構函式:

在全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫。但如果乙個程式中有多個檔案,而不同的檔案中都定義了全域性物件,則這些物件的建構函式的執行順序是不確定的。當main函式執行完畢或呼叫exit函式時(此時程式終止),呼叫析構函式。

如果定義的是區域性自動物件(例如在函式中定義物件),則在建立物件時呼叫其建構函式。如果函式被多次呼叫,則在每次建立物件時都要呼叫建構函式。在函式呼叫結束、物件釋放時先呼叫析構函式。

如果在函式中定義靜態(static )區域性物件,則只在程式第一次呼叫此函式建立物件時呼叫建構函式一次,在呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫析構函式。

C 建構函式 析構函式順序

1 輸入以下程式,分析執行結果。2 修改上面的4個類,新增析構函式,在析構函式中輸出各私有資料成員的值。並分析結果。實驗分析以及心得體會 主要是類的多繼承性,在繼承了多個基類之後,派生類物件呼叫的建構函式和析構函式的順序,以及在派生關係中同名函式的隱藏關係,根據實驗結果可以發現派生類物件在呼叫建構函...

構造和析構函式呼叫順序

c 中建構函式與析構函式的呼叫順序 c 建構函式和析構函式的呼叫順序 基類建構函式 物件成員建構函式 派生類本身的建構函式 派生類本身的析構函式 物件成員析構函式 基類析構函式 與構造順序正好相反 區域性物件,在退出程式塊時析構 靜態物件,在定義所在檔案結束時析構 全域性物件,在程式結束時析構 繼承...

C 建構函式和析構函式的呼叫順序

c 如果沒有分配資源那麼就不一定需要析構函式,否則就需要釋放資源,如下 class vector sz constructor acquire memory vector destructor release memory private double elem elem points to an ...