EasyC++,析構函數
大家好,我是梁唐。
析構函數
當我們使用構造函數創建對象之后,程序負責跟蹤對象,直到對象過期位置。
對象過期時,程序會自動調用一個特殊的成員函數,這個成員函數就叫做析構函數。析構函數這個翻譯有一些隱晦,它的英文是deconstructor,我個人感覺翻譯成銷毀函數更確切一些。
也就是說當對象不再使用,即將被銷毀的時候會調用析構函數。如果我們構造函數當中創建的都是存儲持續性的變量,也就是不是使用new創建的對象。這些對象會自動銷毀,并不需要析構函數執行什么邏輯。如果構造函數當中使用了new動態分配了內存,那么需要在析構函數當中添加對應的delete語句,將內存釋放。
比如這個例子:
- class Algo {
- public:
- Algo(const char* name) {
- name_ = new char[strlen(name)+1];
- strcpy(name_, name);
- }
- private:
- char *name_;
- }
在這個例子當中,Algo類當中的name_變量是通過new動態分配的,那么當Algo的實例銷毀的時候,需要我們在析構函數當中手動執行delete的邏輯。
析構函數和構造函數幾乎完全一樣,只在類名前加上~。析構函數也可以沒有返回值和聲明類型,并且析構函數沒有參數。
加上析構函數之后,上面的例子是這樣的:
- class Algo {
- public:
- Algo(const char* name) {
- name_ = new char[strlen(name)+1];
- strcpy(name_, name);
- }
- ~Algo() {
- delete []name_;
- }
- private:
- char *name_;
- }
有一點需要注意,析構函數調用應該是由編譯器決定,如果創建的是靜態存儲類對象,則析構函數在程序結束時自動調用,如果創建的是自動存儲類對象,析構函數會在程序執行完代碼塊時被自動調用。如果是通過new創建的,那么則在使用delete時被調用。一般我們不會手動調用析構函數。
由于類對象過期時析構函數會被自動調用,因此必須有一個析構函數。如果程序員沒有提供析構函數,那么編譯器將隱式地聲明一個默認析構函數。