C++建構函式解構函式的執行過程

wzm10455發表於2013-02-19
建構函式:    C++提供了建構函式(constructor)來處理物件的初始化。在建立物件時自動執行。建構函式的名字必須與類名同名,它不具有任何型別,不返回任何值。建構函式的功能是由使用者定義的,使用者根據初始化的要求設計函式體和函式引數。在類物件進入其作用域時呼叫建構函式。建構函式沒有返回值,因此也不需要在定義建構函式時宣告型別,這是它和一般函式的一個重要的不同之點。

      如果建構函式不帶引數,在函式體中對資料成員賦初值,使該類的每一個物件都得到同一組初值。採用帶引數的建構函式,在呼叫不同物件的建構函式時,從外面將不同的資料傳遞給建構函式,以實現不同的初始化。建構函式首部的一般格式為  建構函式名(型別 1 形參1,型別2 形參2,…)

解構函式:     解構函式(destructor)也是一個特殊的成員函式,它的作用與建構函式相反,它的名字是類名的前面加一個“~”符號,解構函式是與建構函式作用相反的函式。當物件的生命期結束時,會自動執行解構函式:①如果在一個函式中定義了一個物件(它是自動區域性物件),當這個函式被呼叫結束時,物件應該釋放,在物件釋放前自動執行解構函式。②static區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫解構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫static區域性物件的解構函式。③如果定義了一個全域性物件,則在程式的流程離開其作用域時(如main函式結束或呼叫exit函式) 時,呼叫該全域性物件的解構函式。④如果用new運算子動態地建立了一個物件,當用delete運算子釋放該物件時,先呼叫該物件的解構函式。

解構函式的作用並不是刪除物件,而是在撤銷物件佔用的記憶體之前完成一些清理工作,使這部分記憶體可以被程式分配給新物件使用。解構函式不返回任何值,沒有函式型別,也沒有函式引數。因此它不能被過載。一個類可以有多個建構函式,但只能有一個解構函式。當然,解構函式也可被用來執行“使用者希望在最後一次使用物件之後所執行的任何操作”,例如輸出有關的資訊。如果使用者沒有定義解構函式,C++編譯系統會自動生成一個解構函式,實際上什麼操作都不進行。

在一般情況下,呼叫解構函式的次序正好與呼叫建構函式的次序相反:最先被呼叫的建構函式,其對應的(同一物件中的)解構函式最後被呼叫,而最後被呼叫的建構函式,其對應的解構函式最先被呼叫。

15、C++基本概念----建構函式和解構函式 - EdwardLewis - 墨涵天地

(1) 在全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫。但如果一個程式中有多個檔案,而不同的檔案中都定義了全域性物件,則這些物件的建構函式的執行順序是不確定的。當main函式執行完畢或呼叫exit函式時(此時程式終止),呼叫解構函式。(2) 如果定義的是區域性自動物件(例如在函式中定義物件),則在建立物件時呼叫其建構函式。如果函式被多次呼叫,則在每次建立物件時都要呼叫建構函式。在函式呼叫結束、物件釋放時先呼叫解構函式。(3) 如果在函式中定義靜態(static)區域性物件,則只在程式第一次呼叫此函式建立物件時呼叫建構函式一次,在呼叫結束時物件並不釋放,因此也不呼叫解構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫解構函式。
        基類解構函式通常是虛擬函式。

 一個類只有一個解構函式。



在建立派生類物件時:基類的建構函式→派生類的建構函式;

1、如果在派生類的建構函式中顯式呼叫父類建構函式,則必須寫到初始化參數列裡。

2、如果在派生類的建構函式中未顯式呼叫父類建構函式,則預設呼叫父類無函式的建構函式。

3、如果在派生類的建構函式中未顯式呼叫父類建構函式,而父類中未定義任何建構函式或必須有一個建構函式無任何引數。

 

 

在析構派生類物件明:派生類的解構函式→基類的解構函式。 

1.如果用父類指標指向的派生類物件,則父類的解構函式必須宣告為virtual,否則無法呼叫派生類的解構函式。

2.要用正確的引數呼叫直接基類的建構函式,以作為每個派生類建構函式的一部分(討論)
3.普通成員函式不能用這種語法呼叫基類方法
4.類只負責其直接基類的構造。但存在虛基類時有所不同
5.派生類建構函式的引數要包括自己使用的和基類需要使用的所用引數
6.派生類繼承基類的行為和結構,但不繼承建構函式和解構函式
7.要在派生類拷貝建構函式中呼叫基類的拷貝建構函式
8.要在派生類賦值運算子中呼叫基類的賦值運算子
9. 派生類解構函式並不明確呼叫基類的解構函式
10. 所用虛基類都由最後的派生類的建構函式所初始化。當建立物件時,將忽略子物件建構函式內部對虛基類建構函式的呼叫。
11.公有繼承是繼承的主要模式,私有繼承只在特殊情況下用(如實現堆疊類可從列表類中繼承,但它不是某種列表,重新匯出私有基類的成員。)私有繼承沒有多型性。
12.在單一繼承能實現目的時,不要用多重繼承
13.繼承的優點:程式碼重用,在正在執行的程式中加入新類和新功能(如衛星、病人監護),動態聯編,多型性。

相關文章