中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中的構造函數與析造函數詳解

發布時間:2020-09-05 18:44:13 來源:腳本之家 閱讀:148 作者:ab198604 欄目:編程語言

C++中的構造函數與析造函數詳解

 構造函數的概念

        (1)構造函數是特殊的成員函數
        (2)當創建類類型的新對象時,系統自動會調用構造函數
        (3) 構造函數是為了保證對象的每個數據成員都被正確的初始化。        

        創建構造函數的注意事項:

        (1) 函數名與類名相同;
        (2) 沒有返回類型,返回類型也不能是void型
        (3) 構造函數通常情況下聲明為public,否則不能像其它成員函數那樣被顯示的調用
        (4) 構造函數也可以聲明為private,但是是用作特殊用途-----如單例類singleton時就是將構造函數聲明為private.
        (5) 構造函數可以有任何類型與任意個數的參數,一個類可以定義多個構造函數(重載)

        關于默認構造函數:

        默認構造函數是構造函數的其中一種。除此之外,還有拷貝構造函數與轉換構造函數,這個后期再說明。默認構造函數是不帶任何參數的構造函數,如果程序中未聲明定義任何一個構造函數,則系統將自動產生一個默認的構造函數,此時不會對對象數據成員進行初始化,那么對象數據成員的值將是隨機的。而如果我們提供了一個構造函數(只要是構造函數,無論是帶參數的,還是不帶參數的,是拷貝還是轉換構造函數),哪怕只提供了僅僅一個構造函數,系統就不會再為我們提供默認構造函數了。

        下面是關于構造函數的類定義:

class Test 
{ 
public: 
  Test(){} //系統不再提供默認構造函數 
  Test(int val) //構造函數可以重載 
  { 
    val_ = val ; 
  } 
  ~Test(){} 
 
private: 
  int val_; 
}; 

        下面代碼是Test類的使用:

int main() 
{ 
  Test t1; //系統調用不帶參數的默認構造函數 
  Test t2(5); //系統調用帶一個參數的構造函數 
   
  Test *t3 = new Test(20); //分配內存+調用帶一個參數的構造函數,這種操作稱為new operator. 
 
  delete t3; // 調用析構函數+ 釋放內存 
} 

        請注意:全局對象的構造函數是先于main函數執行的       

析構函數概念

        (1) 函數名與類名類似,前面多了一個"~"符號(取反符)
        (2) 沒有返回類型
        (3) 不能有參數
        (4) 不能被重載(這個好理解,因為沒有參數,自然不能重載)
        (5) 如果沒有定義析構函數,則編譯器會自動生成一個默認的析構函數,函數體是空的。

 析構函數與對象數組

        把握一個原則,構造幾個對象,就要調用幾次析構函數。

        拿上面的Test類來進行舉例說明:

int main() 
{ 
  Test t[2] = {10,20}; //對象數組初始化,創建2個元素,即2個Test對象,分別傳遞初始值為10,20,就是說調用的是帶一個參數的構造函數。由于創建了2個對象,構造函數也調用了兩次 
  Test *t2 = new Test(2); //僅創建一個對象,初始值為2,調用帶一個參數的構造函數。 
 
  delete t2; //調用一次析構函數。 
 
  Test *t3 = new Test[2]; //在堆上創建2個對象,無初始值,調用的是不帶參數的默認構造函數,由于是2個對象,故調用了2次。 
 
  delete [] t3; //調用兩次析構函數,還有釋放內存操作。 
} 

        注意:析構函數可以被顯式調用,但是當對象的生命周期結束后,系統還會再調用一次析構函數,這樣就造成了調用2次析構函數,如果在析構函數中含有delete操作,就會出現問題。所以析構函數的顯式調用比較少。STL源碼中有用到析構函數的顯式調用,這屬于一些特殊用法。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

襄汾县| 饶河县| 新宁县| 六枝特区| 进贤县| 浪卡子县| 马关县| 安多县| 会东县| 丹凤县| 海门市| 安溪县| 周宁县| 南澳县| 金昌市| 开封县| 应用必备| 丰都县| 康平县| 固镇县| 昌宁县| 西安市| 新邵县| 兴文县| 平乐县| 柯坪县| 瑞安市| 北宁市| 涞源县| 新巴尔虎右旗| 遂昌县| 文昌市| 北安市| 江孜县| 兴国县| 呼和浩特市| 杭锦旗| 井冈山市| 乌兰县| 延寿县| 辉县市|