這篇介紹了析構函式,是我的讀書筆記,我希望它夠簡短但又比較全面,起到複習的作用。如果有一些c++知識記不清楚了,它可以幫你很快回憶起來。
析構函式(destructor)的名字與類名相同,但是前面要加「~」。析構函式沒有引數和返回值,當然也就不能被過載。
析構函式在物件消亡時自動呼叫,這是都了解的情況,但是實際上這還隱含的說:函式的引數物件以及作為函式返回值的物件,在消亡時也會引發析構函式呼叫。
1 #include2using
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。看一段**:
1class
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 這種情況下,我是記住了,析構函式在執行的時候,只有乙個執行,但...