建構函式與析構函式執行順序及其與虛函式關係

2021-06-18 13:24:22 字數 1612 閱讀 9151

1.建構函式與析構函式執行順序:

(1) 繼承類首先從基類建構函式開始執行,然後呼叫成員物件的建構函式,最後呼叫自己的建構函式(中間可能存在多個層次),;

(2)析構函式的執行順序與建構函式相反,析構函式呼叫之後會呼叫成員物件的析構函式;

(3)成員物件的構造順序是宣告順序,不是建構函式的初始化列表順序,這樣可以保證順序的唯一性。

(4) 區域性物件在程式結束或函式退出時會自動呼叫析構函式,但是分配在堆中的物件(new)不會,除非顯示呼叫delete。

借用**說明:

#include #include #include #include #include using namespace::std;

class c

~c()

};class a

~a()

};class b : public a

b()

~b()

private:

c _c;

a _a;

};int main(int argc, char**argv)

輸出結果為:caacab~b~a~c~a~a~c

構造c和a輸出ca,b從基類a開始構造輸出a,然後是其成員物件_c和_a按照宣告順序構造ca(如果調整宣告順序會發現輸出順序相反),然後呼叫b自身的建構函式。

main函式退出,析構區域性物件,從b開始首先b的析構函式~b,然後成員物件_c和_a,析構順序與宣告順序相反~a~c(如果調整宣告順序會發現輸出順序相反),然後b的基類呼叫析構函式~a,然後a和c分別呼叫析構函式~a~c。

如果main函式使用物件d和e(注釋a和c),因為是分配在堆中,所以函式退出時候不會釋放d和e,即不會呼叫析構函式,輸出結果變為caacab~b~a~c~a。

同時,如果b的建構函式採用注釋行的方式(main函式中b使用b b(a, c)),物件_a和_c的賦值方式是採用拷貝函式,不會呼叫建構函式,因此會少輸出ca一次,輸出結果為caab~b~c~a~a~a~c。但是在物件已經建立,因此在析構的時候,析構函式照常呼叫。

2. 虛函式與建構函式和析構函式 

(1) 建構函式本身不能是虛函式;並且虛機制在建構函式中不起作用(在建構函式中的虛函式只會呼叫它的本地版本)。

(2)析構函式本身常常要求是虛函式;但虛機制在析構函式中不起作用,因為可能會引起呼叫已經被delete掉的類的虛函式的問題。

(3) 若類中使用了虛函式,析構函式一定要是虛函式,比如使用虛擬機制呼叫delete,沒有虛擬的析構函式,不能保證delete的是你希望delete的物件。

**說明:

#include #include using namespace::std;

class base

virtual void init()

};class super : public base

virtual void init()

};int main(int argc, char**argv)

輸出結果為:

init base

init super

結果無需繼續解釋。

如有錯誤,謝謝指出更正!

C 中建構函式與析構函式的執行順序

今天在測試乙個建構函式和析構函式的用例的時候,發現我們所鍾愛的vc6.0實在是bug問題越來越多,對於學習c 的新手來講,有必要在這裡給大家說明一下。建構函式順序為 全域性物件的建構函式 main函式中物件的建構函式,包括automatic static依次呼叫 main中遇到函式中有區域性物件時,...

C 建構函式 析構函式順序

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

建構函式與析構函式

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