C++中的構(gòu)造函數(shù)與析造函數(shù)詳解

C++中的構(gòu)造函數(shù)與析造函數(shù)詳解

目前成都創(chuàng)新互聯(lián)公司已為上千多家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)站空間、網(wǎng)站托管、服務器托管、企業(yè)網(wǎng)站設計、新晃網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

 構(gòu)造函數(shù)的概念

        (1)構(gòu)造函數(shù)是特殊的成員函數(shù)
        (2)當創(chuàng)建類類型的新對象時,系統(tǒng)自動會調(diào)用構(gòu)造函數(shù)
        (3) 構(gòu)造函數(shù)是為了保證對象的每個數(shù)據(jù)成員都被正確的初始化。        

        創(chuàng)建構(gòu)造函數(shù)的注意事項:

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

        關(guān)于默認構(gòu)造函數(shù):

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

        下面是關(guān)于構(gòu)造函數(shù)的類定義:

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

        下面代碼是Test類的使用:

int main() 
{ 
  Test t1; //系統(tǒng)調(diào)用不帶參數(shù)的默認構(gòu)造函數(shù) 
  Test t2(5); //系統(tǒng)調(diào)用帶一個參數(shù)的構(gòu)造函數(shù) 
   
  Test *t3 = new Test(20); //分配內(nèi)存+調(diào)用帶一個參數(shù)的構(gòu)造函數(shù),這種操作稱為new operator. 
 
  delete t3; // 調(diào)用析構(gòu)函數(shù)+ 釋放內(nèi)存 
} 

        請注意:全局對象的構(gòu)造函數(shù)是先于main函數(shù)執(zhí)行的       

析構(gòu)函數(shù)概念

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

 析構(gòu)函數(shù)與對象數(shù)組

        把握一個原則,構(gòu)造幾個對象,就要調(diào)用幾次析構(gòu)函數(shù)。

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

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

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

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

標題名稱:C++中的構(gòu)造函數(shù)與析造函數(shù)詳解
文章分享:http://muchs.cn/article26/ijdicg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)自適應網(wǎng)站、定制網(wǎng)站、商城網(wǎng)站建站公司、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設