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...