C++建構函式解構函式的執行過程
如果建構函式不帶引數,在函式體中對資料成員賦初值,使該類的每一個物件都得到同一組初值。採用帶引數的建構函式,在呼叫不同物件的建構函式時,從外面將不同的資料傳遞給建構函式,以實現不同的初始化。建構函式首部的一般格式為 建構函式名(型別 1 形參1,型別2 形參2,…)
解構函式: 解構函式(destructor)也是一個特殊的成員函式,它的作用與建構函式相反,它的名字是類名的前面加一個“~”符號,解構函式是與建構函式作用相反的函式。當物件的生命期結束時,會自動執行解構函式:①如果在一個函式中定義了一個物件(它是自動區域性物件),當這個函式被呼叫結束時,物件應該釋放,在物件釋放前自動執行解構函式。②static區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫解構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫static區域性物件的解構函式。③如果定義了一個全域性物件,則在程式的流程離開其作用域時(如main函式結束或呼叫exit函式) 時,呼叫該全域性物件的解構函式。④如果用new運算子動態地建立了一個物件,當用delete運算子釋放該物件時,先呼叫該物件的解構函式。解構函式的作用並不是刪除物件,而是在撤銷物件佔用的記憶體之前完成一些清理工作,使這部分記憶體可以被程式分配給新物件使用。解構函式不返回任何值,沒有函式型別,也沒有函式引數。因此它不能被過載。一個類可以有多個建構函式,但只能有一個解構函式。當然,解構函式也可被用來執行“使用者希望在最後一次使用物件之後所執行的任何操作”,例如輸出有關的資訊。如果使用者沒有定義解構函式,C++編譯系統會自動生成一個解構函式,實際上什麼操作都不進行。
在一般情況下,呼叫解構函式的次序正好與呼叫建構函式的次序相反:最先被呼叫的建構函式,其對應的(同一物件中的)解構函式最後被呼叫,而最後被呼叫的建構函式,其對應的解構函式最先被呼叫。
(1) 在全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫。但如果一個程式中有多個檔案,而不同的檔案中都定義了全域性物件,則這些物件的建構函式的執行順序是不確定的。當main函式執行完畢或呼叫exit函式時(此時程式終止),呼叫解構函式。(2) 如果定義的是區域性自動物件(例如在函式中定義物件),則在建立物件時呼叫其建構函式。如果函式被多次呼叫,則在每次建立物件時都要呼叫建構函式。在函式呼叫結束、物件釋放時先呼叫解構函式。(3) 如果在函式中定義靜態(static)區域性物件,則只在程式第一次呼叫此函式建立物件時呼叫建構函式一次,在呼叫結束時物件並不釋放,因此也不呼叫解構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫解構函式。
基類解構函式通常是虛擬函式。
一個類只有一個解構函式。
在建立派生類物件時:基類的建構函式→派生類的建構函式;
1、如果在派生類的建構函式中顯式呼叫父類建構函式,則必須寫到初始化參數列裡。
2、如果在派生類的建構函式中未顯式呼叫父類建構函式,則預設呼叫父類無函式的建構函式。
3、如果在派生類的建構函式中未顯式呼叫父類建構函式,而父類中未定義任何建構函式或必須有一個建構函式無任何引數。
在析構派生類物件明:派生類的解構函式→基類的解構函式。
1.如果用父類指標指向的派生類物件,則父類的解構函式必須宣告為virtual,否則無法呼叫派生類的解構函式。
3.普通成員函式不能用這種語法呼叫基類方法
4.類只負責其直接基類的構造。但存在虛基類時有所不同
5.派生類建構函式的引數要包括自己使用的和基類需要使用的所用引數
6.派生類繼承基類的行為和結構,但不繼承建構函式和解構函式
7.要在派生類拷貝建構函式中呼叫基類的拷貝建構函式
8.要在派生類賦值運算子中呼叫基類的賦值運算子
9. 派生類解構函式並不明確呼叫基類的解構函式
10. 所用虛基類都由最後的派生類的建構函式所初始化。當建立物件時,將忽略子物件建構函式內部對虛基類建構函式的呼叫。
11.公有繼承是繼承的主要模式,私有繼承只在特殊情況下用(如實現堆疊類可從列表類中繼承,但它不是某種列表,重新匯出私有基類的成員。)私有繼承沒有多型性。
12.在單一繼承能實現目的時,不要用多重繼承
13.繼承的優點:程式碼重用,在正在執行的程式中加入新類和新功能(如衛星、病人監護),動態聯編,多型性。
相關文章
- C++ 建構函式和解構函式C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 建構函式與解構函式函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- C++入門記-建構函式和解構函式C++函式
- 關於建構函式與解構函式的分享函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- 類的建構函式和解構函式函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- C++解構函式C++函式
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- C++拷貝建構函式詳解C++函式
- 建構函式詳解函式
- C++複製建構函式C++函式
- 執行建構函式中指定的任務函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- ## 建構函式函式
- js函式執行過程的探究JS函式
- c++ 的學習 建構函式1C++函式
- Java建構函式詳解Java函式
- [cpp]C++中的解構函式C++函式
- 建構函式與普通函式的區別函式
- JavaScript 建構函式JavaScript函式
- C++:建構函式的分類和呼叫C++函式
- C++型別轉換建構函式C++型別函式
- 建立派生類物件,建構函式的執行順序物件函式
- 關於python建構函式的過載Python函式
- 過載運算子、解構函式函式
- 【譯】JavaScript 工廠函式 vs 建構函式JavaScript函式
- 11-建構函式函式
- 初識建構函式函式
- JavaScript Date()建構函式JavaScript函式
- 建構函式建立物件函式物件
- 建構函式和類函式
- Golang建立建構函式的方法詳解Golang函式
- C++——建構函式之初始化列表C++函式
- vue原始碼解讀-建構函式Vue原始碼函式
- C++之類解構函式為什麼是虛擬函式C++函式
- del解構函式函式