當前位置:
首頁 > 最新 > 筆記四十二:C+對象的構造和析構

筆記四十二:C+對象的構造和析構

一、前言

創建一個對象時,常常需要作某些初始化的工作,例如對數據成員賦初值。注意類的數據成員是不能在聲明時初始化的。

為了解決這個問題,C++提供了構造函數來處理對象的初始化。

同樣,當對象使用完畢,需要銷毀時,也有一個函數用來清理對象,這就是析構函數

構造函數

1, 構造函數的定義

(1)C++中的類可以定義與類名相同的特殊成員函數,這種與類名相同的成員函數叫做構造函數。語法:ClassName ( ) ;

(2)構造函數在定義時可以有參數;

(3)沒有任何返回類型的聲明;

2.構造函數的調用

自動調用:一般情況下C++編譯器會自動調用構造函數;

手動調用:在一些情況下則需要手工調用構造函數。


三、析構函數

1, 析構函數的定義

(1)C++中的類可以定義一個特殊的成員函數清理對象,這個特殊的成員函數叫做析構函數;語法:~ClassName ( ) ;

(2)析構函數沒有參數也沒有任何返回類型的聲明;

(3)析構函數在對象銷毀時自動被調用。

2, 析構函數的調用

C++編譯器自動調用。


三、單個對象生命周期構造函數和析構函數的調用情況

#include

usingnamespacestd;

classTest

{

public:

Test(void);//構造函數

~Test(void);//析構函數

};

//構造函數

Test::Test(void)

{

cout

}

//析構函數

Test::~Test(void)

{

cout

}

//給對象搭建一個舞台,研究對象的行為

voidobjPlay()

{

//先創建的對象後釋放

Test t1;

}

intmain()

{

objPlay();

system("pause");

return0;

}

運行結果:

我是構造函數!

我是析構函數!

請按任意鍵繼續...

【1】在類Test中,我們定義了兩個函數,之一是跟類同名的函數Test ( ),這個就是構造函數,我們上面說到了,構造函數的聲明沒有任何返回類型。並且構造函數默認是沒有參數的,後面可以寫帶參數的構造函數;

【2】在Test類中,我們定義了另外一個函數~Test( ),根據上面說到的,這個是析構函數,同樣,析構函數沒有任何返回類型;

【3】構造函數和析構函數默認情況下是系統自動調用的。

【4】為什麼我們定義了一個函數objPlay()呢?如果我們不用這個objPlay函數,直接在主函數中定義一個類:

intmain()

{

Test t1;

system("pause");

return0;

}

在聲明對象t1時,按照上面說的,C++編譯器自動調用構造函數,然後這個t1對象是個局部變數,main函數執行完畢時,t1對象才會被銷毀,也就才調用析構函數。但是因為前面有個system(「pause」)語句,執行後系統會停止,那麼這個對象t1就不會銷毀,也就不會去調用析構函數,因此我們只會看到調用構造函數,不會看到調用析構函數。

運行結果:

我是構造函數!

請按任意鍵繼續...

【5】因此,在驗證構造函數、析構函數的調用時,我們需要為我們定義的對象搭建一個舞台,在這個舞台上我們定義一個對象,這個對象在函數執行完成後還可以被銷毀,從而調用析構函數,因此我們就單獨定義了一個函數objPlay。

【6】先看上面完整程序運行後的結果。先後輸出了兩句話「我是構造函數」、「我是析構函數」,這就說明我們定義對象t1時,編譯器自動調用了構造函數,然後對象被銷毀時,編譯器自動調用了析構函數。可以通過單步調試去更清晰的認識這點。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 編程助手 的精彩文章:

TAG: 編程助手 |