C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用順序詳解
前言
在使用構(gòu)造函數(shù)和析構(gòu)函數(shù)時,需要特別注意對它們的調(diào)用時間和調(diào)用順序。在一般情況下,調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)的次序相反:最先被調(diào)用的構(gòu)造函數(shù),其對應的(同一對象中的)析構(gòu)函數(shù)最后被調(diào)用,而最后被調(diào)用的構(gòu)造函數(shù),其對應的析構(gòu)函數(shù)最先被調(diào)用。
簡單來說,其構(gòu)造函數(shù)的順序就一句話:
基類構(gòu)造函數(shù) -> 成員的構(gòu)造函數(shù) -> 構(gòu)造函數(shù)體內(nèi)語句
看下面一個代碼示例:
#include <iostream> using namespace std; class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } }; class B { public: B(int b) { cout << "B(" << b << ")" << endl; } ~B() { cout << "~B()" << endl; } }; class C { public: C(int c) { cout << "C(" << c << ")" << endl; } ~C() { cout << "~C()" << endl; } }; class D { public: D() { cout << "D()" << endl; } ~D() { cout << "~D()" << endl; } }; class E: public B, public A { public: D d; C c; E(): c(3), B(5) { cout << "E()" << endl; } ~E() { cout << "~E()" << endl; } }; int main() { E e; return 0; }
你能看出這份代碼的輸出嗎?
依照上面提到的,首先應該執(zhí)行的是基類的構(gòu)造函數(shù)。不過 C++ 語言是支持多繼承的,那么當某個類繼承多個類時,其構(gòu)造順序又是怎樣的呢?答案是:簡單的依照繼承的順序構(gòu)造。
接下來,就會執(zhí)行其成員變量的構(gòu)造函數(shù),這個順序也很簡單,就是依照類代碼中成員變量的順序依次執(zhí)行的。
最后才會執(zhí)行構(gòu)造函數(shù)中的具體代碼。
注意,在上述過程中,執(zhí)行的順序與構(gòu)造函數(shù)參數(shù)的順序無關(guān)。
通過 new 創(chuàng)建一個對象會調(diào)用其構(gòu)造函數(shù),通過 delete 刪除一個對象會調(diào)用其析構(gòu)函數(shù)。
如果沒有顯示的使用 delete 刪除一個對象的話,析構(gòu)函數(shù)執(zhí)行的順序與構(gòu)造函數(shù)的順序相反。
所以,上述代碼的輸出就是:
B(5) A() D() C(3) E() ~E() ~C() ~D() ~A() ~B()
下面歸納一下什么時候調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù):
1) 在全局范圍中定義的對象(即在所有函數(shù)之外定義的對象),它的構(gòu)造函數(shù)在文件中的所有函數(shù)(包括main函數(shù))執(zhí)行之前調(diào)用。但如果一個程序中有多個文件,而不同的文件中都定義了全局對象,則這些對象的構(gòu)造函數(shù)的執(zhí)行順序是不確定的。當main函數(shù)執(zhí)行完畢或調(diào)用exit函數(shù)時(此時程序終止),調(diào)用析構(gòu)函數(shù)。
2) 如果定義的是局部自動對象(例如在函數(shù)中定義對象),則在建立對象時調(diào)用其構(gòu)造函數(shù)。如果函數(shù)被多次調(diào)用,則在每次建立對象時都要調(diào)用構(gòu)造函數(shù)。在函數(shù)調(diào)用結(jié)束、對象釋放時先調(diào)用析構(gòu)函數(shù)。
3) 如果在函數(shù)中定義靜態(tài)(static )局部對象,則只在程序第一次調(diào)用此函數(shù)建立對象時調(diào)用構(gòu)造函數(shù)一次,在調(diào)用結(jié)束時對象并不釋放,因此也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時,才調(diào)用析構(gòu)函數(shù)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
欄 目:C語言
下一篇:C語言 數(shù)據(jù)結(jié)構(gòu)之中序二叉樹實例詳解
本文標題:C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用順序詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1804.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文