在構造器與析構器專案中 我們知道c++支援程式設計師自定義建立或銷毀乙個物件時自動呼叫的方法(構造器和析構器)
在沒有類繼承關係下的類構造器與析構器的執行規則
系統在建立某個類的例項時會第一時間自動呼叫這個類的構造器
物件消亡時,析構器自動被呼叫,用來釋放物件占用的空間
在類繼承的情況下構造器與析構器的執行規則
基類的構造器將在子類的構造器呼叫之前被呼叫這是由於基類必須在子類之前被初始化的原則所導致的
與構造器的情況相反基類的析構器將在子類的最後一條語句執行完畢後才被呼叫(子類的析構器先呼叫 基類最後呼叫)
也就是在類繼承關係下,構造器的呼叫順序為基類優先,而析構器的呼叫順序為子類優先.
帶有引數的構造器宣告
class
animal
//animal基類的建構函式定義(帶乙個string類的引數 t***)
animal::
animal
(string t***)
//派生自animal基類的子類monkey
class
monkey
:public animal
;繼承機制下的派生自animal基類和looklike基類的子類monkey的 構造器
monkey::
monkey
(string t***)
:animal
(t***)
此時monkey
構造器在進行呼叫之前 首先呼叫了基類animal的構造器也就是首先讀取了基類構造器帶的t***
引數 到基類成員string ***
中 所以在monkey
這個子類繼承animal
這個基類的成員時***
已經被構造器初始化賦值
注意:
在子類構造器定義中的: animal(t***)
作用是 當呼叫monkey子類的構造器時以t***
作為輸入引數 ,animal基類的構造器也將被呼叫(將輸入引數t***
傳遞給此構造器)
於是,當建立物件為monkey monkey("雌性")
時 將把物件中的字串傳遞給monkey(string t***)
和animal(string t***)
構造器中的t***
賦值動作實際發生在animal基類方法中
相關**
class
animal
;//todoanimal基類的建構函式
animal::
animal
(string t***)
//todo派生自animal基類和looklike基類的子類monkey
class
monkey
:public animal
;//todo繼承機制下的派生自animal基類和looklike基類的子類monkey的 構造器
monkey::
monkey
(string t***)
:animal
(t***)
//當呼叫monkey派生類的構造器時 以string t***作為輸入引數 同時animal基類的構造器也將被呼叫(t*** 輸入引數將傳遞給他)
//當我們呼叫物件monkey monkey("雌性的")時 將把字串 "雌性的" 傳遞給 monkey()和animal()構造器 賦值動作實際發生在animal()方法裡
void monkey::
climb()
intmain()
從程式的執行結果可以得出結論:
構造器也可以帶有引數,並且可以是任何引數,這個引數的輸入條件是在宣告物件時在後方加上括號並在括號中輸入與構造中帶的輸入引數一致的引數
在銷毀某個物件時 ,除了此物件的類析構器會被呼叫之外,此類的基類的析構器也將被自動呼叫,些事情編譯器會自動替你處理。因為析構器不需要輸入引數,所以根本用不著使用:superclassmethod(arguments)語法!
與類繼承機制下構造器的情況相反,基類的析構器將在子類最後一條語句執行完畢後 才被呼叫
類繼承機制下 基類子類的構造器和析構器的執行流程**
總結:基類的構造器將在子類的構造器呼叫之前被呼叫這是由於基類必須在子類之前被初始化的原則所導致的
與構造器的情況相反 基類的析構器將在子類的最後一條語句執行完畢後才被呼叫(子類的析構器先呼叫 基類最後呼叫)
析構器將在main函式即將退出時 進行作用
推薦文章
C 中的建構函式(構造器)與析構函式(析構器)
該文章的程式 是按繼承中的基類子類來寫的。跟基本的建構函式與析構函式一樣。只是加了一丟丟東西。現在我們直奔主題!c 建構函式和析構函式主要負責構建物件和銷毀物件,在構建物件的時候系統自己呼叫類中的建構函式。在物件作用域結束後,呼叫析構函式銷毀物件。一般來說,建構函式用來完成事先的初始化和準備工作 申...
構造器與析構器
include stdafx.h include using namespace std if 0 構造器 class 類名 class a 特性 在類物件建立時,自動呼叫,完成類物件的初始化。尤其是動態堆記憶體的申請 1.構造器 用於完成物件建立的初始化 2.在物件建立時 自動呼叫 3.系統提供了...
c 繼承中的構造與析構
問題 如何初始化父類成員?父類與子類的建構函式的關係?在子類物件構造時,需要呼叫父類建構函式對其繼承得來的成員進行初始化。在子類物件析構時,需要呼叫父類析構函式對其繼承得來的成員進行清理。繼承中的構造與析構呼叫規則 1.子類物件在建立時會首先呼叫父類的建構函式 2.父類建構函式執行結束後,執行子類的...