建構函式和析構函式

2021-07-03 01:30:56 字數 3918 閱讀 7502

1、建構函式

c++提供了建構函式(constructor)來處理物件的初始化。在建立物件時自動執行。建構函式的名字必須與類名同名,它不具有任何型別,不返回任何值。建構函式的功能是由使用者定義的,使用者根據初始化的要求設計函式體和函式引數。在類物件進入其作用域時呼叫建構函式。建構函式沒有返回值,因此也不需要在定義建構函式時宣告型別,這是它和一般函式的乙個重要的不同之點。

如果建構函式不帶引數,在函式體中對資料成員賦初值,使該類的每乙個物件都得到同一組初值。採用帶引數的建構函式,在呼叫不同物件的建構函式時,從外面將不同的資料傳遞給建構函式,以實現不同的初始化。建構函式首部的一般格式為 建構函式名(型別 1 形參1,型別2 形參2,…)

實參是在定義物件時給出的。定義物件的一般格式為

類名 物件名(實參1,實參2,…);

#include 

using

namespace

std;

class box

;box::box(int h,int w,int len)

int box::volume()

int main( )

c++還提供另一種初始化資料成員的方法——引數初始化表來實現對資料成員的初始化。這種方法不在函式體內對資料成員初始化,而是在函式首部實現。

box∷box(int h,int w,int len):height(h),width(w),length(len)

構 造函式具有相同的名字,而引數的個數或引數的型別不相同。這稱為建構函式的過載。呼叫建構函式時不必給出實參的建構函式,稱為預設建構函式 (default constructor)。參的建構函式屬於預設建構函式。乙個類只能有乙個預設建構函式,儘管在乙個類中可以包含多個建構函式,但是 對於每乙個物件來說,建立物件時只執行其中乙個建構函式。

box( ); //宣告乙個無參的建構函式

box(int h,int w,int len):height(h),width(w),length(len)

//宣告乙個有參的建構函式,用引數的初始化表對資料成員初始化

box(int h=10,int w=10,int

len=10); //在宣告建構函式時指定預設引數

box::box(int h,int w,int

len)

應該在宣告建構函式時指定預設值,而不能只在定義建構函式時指定預設值。如果建構函式的全部引數都指定了預設值,則在定義物件時可以給乙個或幾個實參,也可以不給出實參。在乙個類中定義了全部是預設引數的建構函式後,不能再定義過載建構函式。

#include 

using

namespace

std;

class box

;box::box(int h,int w,int len) //在定義函式時可以不指定預設引數

int box::volume( )

int main( )

如果定義了乙個帶參建構函式,還想使用(預設的)無參建構函式的話,就需要自己定義。
2、析構函式

析構函式(destructor)也是乙個特殊的成員函式,它的作用與建構函式相反,它的名字是類名的前面加乙個「~」符號,析構函式是與建構函式作用相反的函式。當物件的生命期結束時,會自動執行析構函式:①如果在乙個函式中定義了乙個物件(它是自動區域性物件),當這個函式被呼叫結束時,物件應該釋放,在物件釋放前 自動執行析構函式。②static區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫static區域性物件的析構函式。③如果定義了乙個全域性物件,則在程式的流程離開其作用域時(如main函式結束或呼叫exit函式) 時,呼叫該全 局物件的析構函式。④如果用new運算子動態地建立了乙個物件,當用delete運算子釋放該物件時,先呼叫該物件的析構函式。
析構函式的作用並不是刪除物件,而是在撤銷物件占用的記憶體之前完成一些清理工作,使這部分記憶體可以被程式分配給新物件使用。析構函式不返回任何值,沒有函式型別,也沒有函式引數。因此它不能被過載。乙個類可以有多個建構函式,但只能有乙個析構函式。當然,析構函式也可被用來執行「使用者希望在最後一次使用物件之後所執行的任何操作」,例如輸出有關的資訊。如果使用者沒有定義析構函式,c++編譯系統會自動生成乙個析構函式,實際上什麼操作都不進行。

在一般情況下,呼叫析構函式的次序正好與呼叫建構函式的次序相反:最先被呼叫的建構函式,其對應的(同一物件中的)析構函式最後被呼叫,而最後被呼叫的建構函式,其對應的析構函式最先被呼叫。

15、c++基本概念—-建構函式和析構函式 - edwardlewis - 墨涵天地

(1) 在 全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫。但如果乙個程式中有多個檔案, 而不同的檔案中都定義了全域性物件,則這些物件的建構函式的執行順序是不確定的。當main函式執行完畢或呼叫exit函式時(此時程式終止),呼叫析構函 數。(2) 如果定義的是區域性自動物件(例如在函式中定義物件),則在建立物件時呼叫其建構函式。如果函式被多次呼叫,則在每次建立物件時都要呼叫構造函 數。在函式呼叫結束、物件釋放時先呼叫析構函式。(3) 如果在函式中定義靜態(static)區域性物件,則只在程式第一次呼叫此函式建立物件時呼叫構造 函式一次,在呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫析構函式。

基類析構函式通常是虛函式。

乙個類只有乙個析構函式。

3、物件的賦值和複製

1)如果對乙個類定義了兩個或多個物件,則這些同類的物件之間可以互相賦值物件之間的賦值也是通過賦值運算子「=」進行的。這是通過對賦值運算子的過載實現的。

物件名1 = 物件名2;

物件的賦值只對其中的資料成員賦值,而不對成員函式賦值。類的資料成員中不能包括動態分配的資料,否則在賦值時可能出現嚴重後果。

2)用乙個已有的物件快速地複製出多個完全相同的物件。如

box box2(box1);

其作用是用已有的物件box1去轉殖出乙個新物件box2。

其一般形式為

類名 物件2(物件1);

用物件1複製出物件2。

通過複製建立物件時呼叫乙個特殊的建構函式—複製建構函式(copy constructor)。形式如下:

//the copy constructor definition.

box∷box(const box& b)

另一種方便使用者的複製形式,用賦值號代替括號,如

box box2=box1; //用box1初始化box2

其一般形式為 類名 物件名1 = 物件名2;

可以在乙個語句中進行多個物件的複製。如

box box2=box1,box3=box2;

請注意普通建構函式和複製建構函式的區別。

(1) 在形式上

類名(形參表列); //普通建構函式的宣告,如box(int h,int w,int len);

類名(類名& 物件名); //複製建構函式的宣告,如box(box &b);

(2) 在建立物件時,實參型別不同。系統會根據實參的型別決定呼叫普通建構函式或複製建構函式。如

box box1(12,15,16); //實參為整數,呼叫普通建構函式

box box2(box1); //實參是物件名,呼叫複製建構函式

(3) 在什麼情況下被呼叫

普通建構函式在程式中建立物件時被呼叫。

複製建構函式在用已有物件複製乙個新物件時被呼叫,在以下3種情況下需要轉殖物件:

① 程 序中需要新建立乙個物件,並用另乙個同類的物件對它初始化。② 當函式的引數為類的物件時。在呼叫函式時需要將實參物件完整地傳遞給形參,系統是通過呼叫 複製建構函式來實現的。③ 函式的返回值是類的物件。此時需要將函式中的物件複製乙個臨時物件並傳給該函式的呼叫處。

建構函式和析構函式

建構函式沒有返回值,不能被顯示的呼叫。它是在定義物件時由系統自動執行的,而且只執行一次。如果沒有定義建構函式,系統會自動生成乙個建構函式,只是這個建構函式的函式體是空,沒有引數,也不執行任何初始化的操作。帶引數的建構函式 有一種簡練,方便的寫法 建構函式的引數初始化表 box int h,int w...

析構函式和建構函式

每個物件生成的時候都要完成物件的初始化,如設定屬性的初始值。c 中規定每個類都有乙個初始值,如果沒有,系統會產生乙個預設的建構函式。這個建構函式沒有任何引數,不做任何額外的工作。但往往我們會自己寫乙個建構函式,用來進行特殊的初始化工作。這樣的話,編譯器就不會再為其生成預設的建構函式。class 類名...

建構函式和析構函式

stock hot 因為資料部分的訪問狀態是私有的,程式不能訪問資料成員。建立stock的建構函式,由於需要為stock提供3個值,因此應為建構函式提供3個引數值,程式設計師可能指向設定company成員,而其他的設定為0 使用預設引數完成 宣告如下 stock const char co,int ...