程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 析構函數與變量的生存周期實例詳解

C++ 析構函數與變量的生存周期實例詳解

編輯:關於C++

C++ 析構函數與變量的生存周期實例詳解。本站提示廣大學習愛好者:(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)靜態局部變量在第一次執行定義語句時構造產生,在程序的結尾全局變量消亡前消亡。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved