有關析構函式和建構函式的幾點說明

2021-09-26 04:26:31 字數 1043 閱讀 1259

有關析構函式和建構函式的幾點說明:

建構函式和析構函式都不能被繼承(建構函式和析構函式是用來處理物件的建立和析構的,它們只知道對在它們的特殊層次的物件做什麼。所以,在整個層次中的所有的建構函式和析構函式都必須被呼叫而不能被繼承。)

建構函式可以過載,析構函式不可以過載(建構函式可以有引數,析構函式沒有引數。)

建構函式不可以是虛函式,析構函式可以是虛函式

(1. 建構函式為什麼不能為虛函式?

a. 儲存空間角度: 虛函式的呼叫需要虛函式表指標,而該指標存放在物件的內容空間中,需要呼叫建構函式才可以建立他的值,否則即使開闢了空間,則虛表指標為隨機值,不會找到建構函式;若建構函式宣告為虛函式,那麼由於物件還未建立,還沒有記憶體空間,更沒有虛函式表位址用來呼叫虛函式——建構函式了。

b. 使用上: 從實現上看,vbtl在構造函式呼叫後才建立,因而建構函式不可能成為虛函式;

虛函式主要是實現多型,在執行時才可以明確呼叫物件,根據傳入的物件型別,來呼叫函式當乙個建構函式被呼叫時,它做的首要的事情之一是初始化它的v p t r。因此,它只能知道它是「當前」類的,而完全忽視這個物件後面是否還有繼承者。當編譯器為這個建構函式產生**時,它是為這個類的建構函式產生**- -既不是為基類,也不是為它的派生類(因為類不知道誰繼承它)。

c. 所以它使用的v p t r必須是對於這個類的v ta b l e。而且,只要它是最後的構造函式呼叫,那麼在這個物件的生命期內, v p t r將保持被初始化為指向這個v ta b l e, 但如果接著還有乙個更晚派生的建構函式被呼叫,這個建構函式又將設定v p t r指向它的 v ta b l e,等.直到最後的建構函式結束。v p t r的狀態是由被最後呼叫的建構函式確定的。這就是為什麼構造函式呼叫是從基類到更加派生 類順序的另乙個理由。

2.析構函式可以使用虛函式?

物件已經建立,虛表指標存放析構函式的位址,基類與派生類都含有析構虛函式,建立基類與子類物件,都含有各類的虛表指標,當寫通用函式時,執行根據傳入物件的型別確定析構函式的位址,然後呼叫該析構函式。 但析構卻不一定,我們往往通過基類的指標來銷毀物件。這時候如果析構函式不是虛函式,就不能正確識別物件型別從而不能正確呼叫析構函式

建構函式和析構函式

建構函式沒有返回值,不能被顯示的呼叫。它是在定義物件時由系統自動執行的,而且只執行一次。如果沒有定義建構函式,系統會自動生成乙個建構函式,只是這個建構函式的函式體是空,沒有引數,也不執行任何初始化的操作。帶引數的建構函式 有一種簡練,方便的寫法 建構函式的引數初始化表 box int h,int w...

析構函式和建構函式

每個物件生成的時候都要完成物件的初始化,如設定屬性的初始值。c 中規定每個類都有乙個初始值,如果沒有,系統會產生乙個預設的建構函式。這個建構函式沒有任何引數,不做任何額外的工作。但往往我們會自己寫乙個建構函式,用來進行特殊的初始化工作。這樣的話,編譯器就不會再為其生成預設的建構函式。class 類名...

建構函式和析構函式

stock hot 因為資料部分的訪問狀態是私有的,程式不能訪問資料成員。建立stock的建構函式,由於需要為stock提供3個值,因此應為建構函式提供3個引數值,程式設計師可能指向設定company成員,而其他的設定為0 使用預設引數完成 宣告如下 stock const char co,int ...