C 學習之類的析構函式

2021-12-30 01:20:03 字數 2354 閱讀 8983

c++學習之類的析構函式

一、認識析構函式

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

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

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

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

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

拿程式說話:

//by mr_listening,06 08 2016

class date

public:

date(int year=1990,int month=1,int day=1)

: _month(year), _year(month), _day(day)

~date()

cout << "~date()" << this << endl;

private:

int _year=1990;

int _month;

int _day;

void test()

date d1;

int main()

test();

return 0;

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

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

二、銷毀,清理?

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

void test ()

int a=10;

int b=20;

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

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

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

三、析構函式來阻止該型別物件被銷毀?

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

classdate~date() = delete;private:int_year=1990; int_month;int_day;};

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

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

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

四、注意嘍

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

看下面的改動:

classdate~date()private:int_year=1990; int_month;int_day;int*p;};

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

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

C 之類建構函式與析構函式

類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。class aa a void 使用初始化列表來初始化字段 line line double len len...

C 析構函式 虛析構函式

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

python基礎8之類的析構函式

析構函式,第一次聽說這個函式的名稱,那這個函式到底是幹嘛的呢?什麼才是析構函式吶?定義 在例項銷毀的時候呼叫的函式 2.1 定義 class dog object dog class def init self,name self.name name def sayhi self print the...