析構函式與變數的生存週期

2022-03-02 07:43:16 字數 1554 閱讀 5968

這篇介紹了析構函式,是我的讀書筆記,我希望它夠簡短但又比較全面,起到複習的作用。如果有一些c++知識記不清楚了,它可以幫你很快回憶起來。

析構函式(destructor)的名字與類名相同,但是前面要加「~」。析構函式沒有引數和返回值,當然也就不能被過載。

析構函式在物件消亡時自動呼叫,這是都了解的情況,但是實際上這還隱含的說:函式的引數物件以及作為函式返回值的物件,在消亡時也會引發析構函式呼叫。

1 #include2

using

namespace

std;

3class

cnum

7 cnum()

8 cnum(cnum & n) 9};

1011

cnum fun(cnum n)

1617

intmain()

執行結果:

constractor cnum()

constractor cnum(cnum & n)  //構造形參n

fun()      

constractor cnum(cnum & n)  //構造作為返回值的臨時物件

destructor            //fun的返回值是乙個臨時物件,臨時物件的生存週期只有一條語句

destructor            //離開fun(),形參n消亡

destructor            //main結束時區域性變數n1消亡

請按任意鍵繼續. . .

呼叫函式時使用傳引用而不是直接傳遞物件,可以省掉很多次不必要的函式呼叫,特別是這個函式會被頻繁呼叫的時候。

虛析構函式

析構函式可以是虛函式,但是建構函式不能。(想一想建構函式可以過載,但析構函式不能,這對冤家也算扯平了吧╮(╯▽╰)╭)

一般來說,乙個類如果定義了虛函式,則最好將析構函式也定義成虛函式。之所以有這樣的建議,因為這裡容易出現隱蔽的bug。看一段**:

1

class

cshape 3};

45class ccircle :public

cshape

8 ~ccircle() 9};

1011

intmain()

那麼, delete ptrshape; 執行時是執行了哪乙個析構函式呢?恰恰不是我們希望呼叫的 ~ccircle(),而是呼叫了什麼都不做的~cshape(),記憶體洩露了。為了避免發生這種事一般採取的辦法就是把析構函式定義成虛函式。也就是 virtual ~cshape(); 。只要基類的析構函式是虛函式,那麼派生類的析構函式不論是否用「virtule」關鍵字宣告,都會成為虛析構函式。

1)全部變數的生存週期是從程式開始到最後,而且是先定義的先產生,後消亡。全域性變數的建構函式在進入main()之前就已經呼叫,在推出main()之後才消亡。

2)臨時物件的生存週期不會大於語句的執行時間。型別轉換語句和返回語句等可能會產生臨時變數。

3)區域性變數的生存期是從定義開始到最近的「}」結束

4)靜態區域性變數在第一次執行定義語句時構造產生,在程式的結尾全域性變數消亡前消亡。

15 C 析構函式與變數生命週期

建構函式負責初始化物件 並分配資源,析構函式用於抹除資料並釋放資源 include include using namespace std class store store void char p mem int main void cout main函式出口 endl return0 函式傳參為...

初始化變數與函式生命週期的關係及析構函式的執行時機

想實現輸入兩個值,經過乙個函式什麼都不改變,然後,輸出出來,但發現,中間竟然把原來輸入進去的值給改變了!讓我一頓好找。錯誤 include using namespace std class location location int getx int gety private int x,y vo...

虛析構函式與非虛析構函式問題!

class a class b public a int main 這種情況下,輸出結果我們都知道,是先執行子類的析構函式,後執行父類的析構函式,所以輸出是 b 和 a class a class b public a int main 這種情況下,我是記住了,析構函式在執行的時候,只有乙個執行,但...