析構函式也是一種特殊的成員函式。它執行與建構函式相反的操作,通常用於撤消物件時的一些清理任務,如釋放分配給物件的記憶體空間等。
同樣的,我們來看看析構函式的幾個特點:
class data
~data()
在乙個函式體內定義乙個變數,在test函式中定義a和b兩個變數,在出了test函式後,a和b就會被銷毀(棧上的操作)。如果是乙個指向動態開闢的一塊空間的指標(new,malloc),我們都需要進行free,否則就會記憶體洩露問題。
當類型別物件的成員還有乙個類型別物件,那麼在析構函式裡也會呼叫這個物件的析構函式。
預設的析構函式
每個類都必須有乙個析構函式。
如果類中沒有顯式地為乙個類定義析構函式,編譯系統會自動地生成乙個預設的析構函式
類名::析構函式命(){}
class date
~date()
void get_info(char *);
void send_info(char *);
private:
char *str;
int max_len;
};
析構函式阻止該型別物件被銷毀
我們如果不想要析構函式來對物件進行釋放該怎麼做呢,不顯式的定義顯然是不行的,因為編譯器會生成預設的合成析構函式。之前我們知道了如果想讓系統預設生成自己的建構函式可以利用default,那麼其實還有乙個東西叫做delete。
class date
~date()=delete;
private:
int _year=2019;
int _month;
int _day;
};
這麼寫了,又在底下建立date型別的物件,那麼這個物件將是無法被銷毀的,其實編譯器並不允許這麼做,直接會給我們報錯。
但可以使用動態建立這個類型別物件的,像這樣:date* p = new date;雖然這樣是可行的,但當你delete p的時候依然會出錯。既不能定義乙個物件也不能釋放動態分配的物件,所以還是不要這麼用為好。
一般在顯式的定義了析構函式的情況下,應該也把拷貝建構函式和賦值操作顯式的定義。
class date
~date()
private:
int _year=2019;
int _month;
int _day;
int *p;
};
成員中有動態開闢的指標成員,在析構函式中對它進行了delete,如果不顯式的定義拷貝建構函式,當你這樣:date d2(d1)來建立d2,我們都知道預設的拷貝建構函式是淺拷貝,那麼這麼做的結果就會是d2的成員p和d1的p是指向同一塊空間的,那麼呼叫析構函式的時候回導致用一塊空間被釋放兩次,程式會崩潰。
1)一般順序
呼叫析構函式的次序正好與呼叫建構函式的次序相反,最先被呼叫的建構函式,其對應的建構函式最後被呼叫,而最後被呼叫的建構函式,其對應的析構函式最先被呼叫。
物件1建構函式->物件2的建構函式->物件3的建構函式->物件3的析構函式->物件2的析構函式->物件1的析構函式
2)全域性物件
在全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在所有函式執行之前呼叫。在程式流程離開其作用域時,呼叫該全域性物件的析構函式。(包括main函式)
3)auto區域性物件
區域性自動物件(例函式中定義的物件),則在建立物件時呼叫其建構函式。如果函式被多次呼叫,則每次呼叫時都要呼叫建構函式。在函式呼叫結束、物件釋放時先呼叫析構函式。
4)static區域性物件
在函式中定義靜態區域性物件,則只在程式第一次盜用此函式建立物件時呼叫建構函式一次,在呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫析構函式。
物件的生存期
物件生存期不同分為:區域性物件、全域性物件、靜態物件、動態物件。
(1)區域性物件
當物件被定義時,呼叫建構函式,該物件被建立;當程式退出該物件所在的函式體或程式塊時,呼叫析構函式,物件被釋放。
區域性物件在被定義在乙個函式體或程式塊內的,它的作用域限定在函式體或程式塊內,生存期比較短。
(2)全域性物件
當程式開始執行時,呼叫建構函式,該物件被建立;當程式結束時,呼叫析構函式,該物件被釋放。
靜態物件時被定義在乙個檔案中,它的作用域從定義是起到檔案結束為止,生存期長。
(3)靜態物件
當程式中定義靜態物件時,呼叫建構函式,該物件被建立;當整個程式結束時,呼叫析構函式,物件被釋放。
全域性物件是被定義在某個檔案中,它的作用域包含在該檔案的整個程式中,生存期最長。
(4)動態物件
執行new運算子呼叫建構函式,動態物件被建立;用delete釋放物件時,呼叫析構函式
動態物件由程式設計師掌握,它作用域與生存期是有new和delete之間的時間決定的。
C 析構函式 虛析構函式
1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...
C 析構函式和虛析構函式。
析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...
C 建構函式 析構函式 虛析構函式
一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...