天天看點

c++ 構造函數和析構函數詳解

一、構造函數

1、構造函數的特點

(1)構造函數是類的一個特殊的成員函數,函數名與類名相同;

(2)構造函數的通路屬性應該是公有(public)通路屬性;

(3)構造函數的功能是對對象進行初始化,是以在構造函數中隻能對資料成員做初始化,這些資料成員一般為私有成員,在構造函數中一般不做初始化以外的事情;

(4)構造函數可以在類内定義也可以在類外定義;

(5)構造函數無函數傳回類型。注意:是什麼也不寫,也不可寫void;

(6)在程式運作時,當新的對象被建立,該對象所屬的類的構造函數自動被調用,在該對象生存期中也隻調用這一次。

(7)構造函數可以重載。類中可以有多個構造函數,它們由不同的參數表區分,系統在自動調用時按一般函數重載的規則選一個執行。

2、使用初始化表來實作對資料成員的初始化

初始化表的一般格式:

類名::構造函數名(參數清單):初始化表

{

     構造函數其他實作代碼

}

初始化表的格式:

    對象成員1(參數名或常量),對象成員2(參數名或常量),……對象成

員n(參數名或常量)

例如:定義的構造函數可以改用以下形式:

Cdate:: Cdate(int y, int m,int d): year(y), month(m),day(d){   }

注意:這種寫法友善、簡潔。許多C++程式員喜歡用這種方式初始化所有的資料成員。除了構造函數可以使用初始化表外,類的其他成員函數也可以根據需要使用初始化表。

3、組合類的構造函數初始化

類對象内部嵌套類對象,被嵌套的對象成為内嵌對象。内嵌對象是該類對象的組成部分,當建立該對象時,其内嵌對象也被自動建立。

C++中通過構造函數的初始化表為内嵌對象初始化。組合類的帶有初始化表的狗仔函數的定義格式為:

類名::構造函數名(全部參數表):内嵌對象1(參數表1),内嵌對象2(參數表2),...

{   構造函數體  };

聲明格式為:

類名::構造函數名(全部參數表);

組合類構造函數的執行順序為:

1)按内嵌對象的聲明順序依次調用内嵌對象的構造函數;

2)執行組合類本身的構造函數。

二、析構函數

1、析構函數的作用

    析構函數是一個特殊類成員函數,它的作用與構造函數相反。析構函數的作用是在對象生存期結束之前自動執行,做清理工作。

   例如:

    一個類可能在構造函數中配置設定資源,這些資源要在對象的生存期結束

以前釋放,釋放資源的工作就是自動調用類的析構函數完成的。 

2、析構函數的特點

(1)析構函數函數的名字特别,是類名加“~”字元,表明它與構造函數相反;

(2)析構函數沒有參數,不能指定傳回值類型;      

(3)一個類中隻能定義一個析構函數,是以析構函數不能重載;

(4)在對象生存期結束時,系統自動調用析構函數。

繼續閱讀