C 析構函式

2021-09-24 23:02:16 字數 2314 閱讀 3568

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

這裡我們來簡單說說類的析構函式,它是類的乙個成員函式,名字由波浪號加類名構成。看它的名字我們大概就能聯想到他功能,是執行與建構函式相反的操作:釋放物件使用的資源,並銷毀非static成員。

同樣的,我們來看看析構函式的幾個特點:

函式名是在類名前加上~,無引數且無返回值。

乙個類只能有且有乙個析構函式,如果沒有顯式的定義,系統會生成乙個預設的析構函式(合成析構函式)。

析構函式不能過載。每有一次建構函式的呼叫就會有一次析構函式的呼叫。

拿程式說話:

class date

~date()

private:

int _year=1990;

int _month;

int _day;

};void test()

int main()

在test()函式中構造了物件d1,那麼在出test()作用域d1應該被銷毀,此時將呼叫析構函式,下面是程式的輸出。當然在構建物件時是先呼叫建構函式的,在這裡就不加以說明了。

我們知道,在建構函式中,成員的在初始化是在函式體執行前完成的,並按照成員在類**現的順序進行初始化,而在析構函式中,首先執行函式體,然後再銷毀成員,並且成員按照初始化的逆序進行銷毀。

我們一直在說析構函式的作用是在你的類物件離開作用域後釋放物件使用的資源,並銷毀成員。那麼到底這裡所說的銷毀到底是什麼?那麼繼續往下看:

void test ()

回想我們在乙個函式體內定義乙個變數的情況,在test函式中定義了a和b兩個變數,那麼在出這個函式之後,a和b就會被銷毀(棧上的操作)。那麼如果是是乙個指向動態開闢的一塊空間的指標,我們都知道需要自己進行free,否則會造成記憶體洩漏。

說到這裡,其實在類裡面的情況和這是一樣的,這就是合成析構函式體為空的原因,函式並不需要做什麼,當類物件出作用域時系統會釋放你的內建型別的那些成員。但是像上面說的一樣,如果,我的成員裡有乙個指標變數並且指向了一塊你動態開闢的記憶體,那麼像以前那樣也需要自己來釋放,此時就需要在析構函式內部寫你的釋放**,這樣在呼叫析構函式的時候就可以把你所有的資源進行釋放。(其實這才是析構函式有用的地方,對嗎)

那麼還有一點,當類型別物件的成員還有乙個類型別物件,那麼在析構函式裡也會呼叫這個物件的析構函式。

我們如果不想要析構函式來對物件進行釋放該怎麼做呢,不顯式的定義顯然是不行的,因為編譯器會生成預設的合成析構函式。之前我們知道了如果想讓系統預設生成自己的建構函式可以利用default,那麼其實還有乙個東西叫做delete。

class date

~date() = delete;

private:

int _year=1990;

int _month;

int _day;

};

如果我這麼寫了,又在底下建立date型別的物件,那麼這個物件將是無法被銷毀的,其實編譯器並不允許這麼做,直接會給我們報錯。

但其實是允許我們動態建立這個類型別物件的,像這樣:date* p = new date;雖然這樣是可行的,但當你delete p的時候依然會出錯,原因就不用說了吧。

所以既然這樣做的話既不能定義乙個物件也不能釋放動態分配的物件,所以還是不要這麼用為好嘍。

一般在你顯式的定義了析構函式的情況下,應該也把拷貝建構函式和賦值操作顯式的定義。為什麼呢??

看下面的改動:

class date

~date()

private:

int _year=1990;

int _month;

int _day;

int *p;

};

成員中有動態開闢的指標成員,在析構函式中對它進行了delete,如果不顯式的定義拷貝建構函式,當你這樣:date d2(d1)來建立d2,我們都知道預設的拷貝建構函式是淺拷貝,那麼這麼做的結果就會是d2的成員p和d1的p是指向同一塊空間的,呢麼呼叫析構函式的時候回導致用一塊空間被釋放兩次,程式會崩潰的哦!

最後,我們知道析構函式是可以呼叫的,那麼建構函式可不可以呢?是怎樣的使用環境

c++知識目錄。

C 析構函式 虛析構函式

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

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

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

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

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