析構函式(C )

2022-02-03 16:05:24 字數 1684 閱讀 9815

析構函式又稱終結器,用於析構類的例項。

定義析構函式(destructor) 與建構函式相反,當物件結束其生命週期時(例如物件所在的函式已呼叫完畢),系統自動執行析構函式。析構函式往往用來做「清理善後」 的工作(例如在建立物件時用new開闢了一片記憶體空間,delete會自動呼叫析構函式後釋放記憶體)。

析構函式簡介

以c++語言為例:[1]

析構函式名也應與類名相同,只是在函式名前面加乙個位取反符~,例如~stud( ),以區別於建構函式。它不能帶任何引數,也沒有返回值(包括void型別)。只能有乙個析構函式,不能過載。如果使用者沒有編寫析構函式,編譯系統會自動生成乙個預設的析構函式(即使自定義了析構函式,編譯器也總是會為我們合成乙個析構函式,並且如果自定義了析構函式,編譯器在執行時會先呼叫自定義的析構函式再呼叫合成的析構函式),它也不進行任何操作。所以許多簡單的類中沒有用顯式的析構函式。

析構函式的使用

宣告:

class

car}

該析構函式隱式地對物件的基類呼叫 finalize。這樣,前面的析構函式**被隱式地轉換為:

protected

override

void

finalize()

finally

}

這意味著對繼承鏈中的所有例項遞迴地呼叫 finalize 方法(從派生程度最大的到派生程度最小的)。

注意不應使用空析構函式。如果類包含析構函式,finalize 佇列中則會建立乙個項。呼叫析構函式時,將呼叫垃圾**器來處理該佇列。如果析構函式為空,則只會導致不必要的效能丟失。

程式設計師無法控制何時呼叫析構函式,因為這是由垃圾**器決定的。垃圾**器檢查是否存在應用程式不再使用的物件。如果垃圾**器認為某個物件符合析構,則呼叫析構函式(如果有)並**用來儲存此物件的記憶體。程式退出時也會呼叫析構函式。

可以通過呼叫 collect 強制進行垃圾**,但大多數情況下應避免這樣做,因為這樣會導致效能問題有關更多資訊,請參見強制垃圾**。

使用析構函式釋放資源

通常,與執行時不進行垃圾**的程式語言相比,c# 無需太多的記憶體管理。這是因為 .net framework 垃圾**器會隱式地管理物件的記憶體分配和釋放。但是,當應用程式封裝視窗、檔案和網路連線這類非託管資源時,應當使用析構函式釋放這些資源。當物件符合析構時,垃圾**器將執行物件的 finalize 方法。

資源的顯式釋放

如果您的應用程式在使用昂貴的外部資源,則還建議您提供一種在垃圾**器釋放物件前顯式地釋放資源的方式。可通過實現來自 idisposable 介面的 dispose 方法來完成這一點,該方法為物件執行必要的清理。這樣可大大提高應用程式的效能。即使有這種對資源的顯式控制,析構函式也是一種保護措施,可用來在對 dispose 方法的呼叫失敗時清理資源。

示例下面的示例建立三個類,這三個類構成了乙個繼承鏈。類 first 是基類,second 是從 first 派生的,而 third 是從 second 派生的。這三個類都有析構函式。在 main() 中,建立了派生程度最大的類的例項。注意:程式執行時,這三個類的析構函式將自動被呼叫,並且是按照從派生程度最大的到派生程度最小的次序呼叫。

class

first

}class

second: first

}class

third: second

}class

testdestructors

}

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

C 析構函式和虛析構函式。

析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...