C++ 析構函數與變量的生存周期實例詳解。本站提示廣大學習愛好者:(C++ 析構函數與變量的生存周期實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 析構函數與變量的生存周期實例詳解正文
作者:painterQ
這篇文章主要介紹了C++ 析構函數與變量的生存周期實例詳解的相關資料C++ 析構函數與變量的生存周期實例詳解
這篇介紹了析構函數,是我的讀書筆記,我希望它夠簡短但又比較全面,起到復習的作用。如果有一些C++知識記不清楚了,它可以幫你很快回憶起來。
析構函數(destructor)的名字與類名相同,但是前面要加“~”。析構函數沒有參數和返回值,當然也就不能被重載。
何時調用析構函數
析構函數在對象消亡時自動調用,這是都了解的情況,但是實際上這還隱含的說:函數的參數對象以及作為函數返回值的對象,在消亡時也會引發析構函數調用。
#include<iostream> using namespace std; class CNum { public: int num; ~CNum() { cout << "destructor" << endl; } CNum() { num = 0; cout << "constractor CNum()" << endl; } CNum(CNum & n) { num = n.num; cout << "constractor CNum(CNum & n)" << endl; } }; CNum fun(CNum n) { cout << "fun()start" << endl; n.num = 3; //這裡的修改只是對形參的修改,對實參沒影響 return n; } int main() { CNum n1; n1 = fun(n1); return 0; }
運行結果:
constractor CNum()
constractor CNum(CNum & n) //構造形參n
fun()
constractor CNum(CNum & n) //構造作為返回值的臨時對象
destructor //fun的返回值是一個臨時對象,臨時對象的生存周期只有一條語句
destructor //離開fun(),形參n消亡
destructor //main結束時局部變量n1消亡
請按任意鍵繼續. . .
調用函數時使用傳引用而不是直接傳遞對象,可以省掉很多次不必要的函數調用,特別是這個函數會被頻繁調用的時候。
虛析構函數
析構函數可以是虛函數,但是構造函數不能。(想一想構造函數可以重載,但析構函數不能,這對冤家也算扯平了吧╮(╯▽╰)╭)
一般來說,一個類如果定義了虛函數,則最好將析構函數也定義成虛函數。之所以有這樣的建議,因為這裡容易出現隱蔽的bug。看一段代碼:
class CShape { public: ~CShape() {/*什麼也不做*/} }; class CCircle :public CShape { public: CCircle() {/*這裡分配了內存*/} ~CCircle() {/*這裡釋放了內存*/ } }; int main() { CShape * ptrShape = new CCircle(); delete ptrShape; return 0; }
那麼, delete ptrShape; 執行時是執行了哪一個析構函數呢?恰恰不是我們希望調用的 ~CCircle(),而是調用了什麼都不做的~CShape(),內存洩露了。為了避免發生這種事一般采取的辦法就是把析構函數定義成虛函數。也就是 virtual ~CShape(){/*什麼都不做*/}; 。只要基類的析構函數是虛函數,那麼派生類的析構函數不論是否用“virtule”關鍵字聲明,都會成為虛析構函數。
變量的生存期
1)全部變量的生存周期是從程序開始到最後,而且是先定義的先產生,後消亡。全局變量的構造函數在進入main()之前就已經調用,在推出main()之後才消亡。
2)臨時對象的生存周期不會大於語句的執行時間。類型轉換語句和返回語句等可能會產生臨時變量。
3)局部變量的生存期是從定義開始到最近的“}”結束
4)靜態局部變量在第一次執行定義語句時構造產生,在程序的結尾全局變量消亡前消亡。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!