C 學習之建構函式 析構函式

2021-07-10 08:35:32 字數 2734 閱讀 9808

在c++的類中,都會有乙個或多個建構函式、乙個析構函式、乙個賦值運算操作符。即使我們自己定義的類中,沒有顯示定義它們,編譯器也會宣告乙個預設建構函式、乙個析構函式和乙個賦值運算操作符。例如:

//宣告乙個空類

class empty{};

//但是這個空類和下面這個類是等同的

class empty

; //預設建構函式

empty( const empty & rhs ) //複製建構函式

~empty() //析構函式

empty operator * (const empty & rhs)

};

值得注意的是,只有當這些函式被呼叫的時候,他們才會被編譯器建立出來。

如果我們已經宣告了乙個建構函式,那麼編譯器將不會再建立乙個預設建構函式。

下面來詳細介紹一下建構函式和析構函式。

1.建構函式

建構函式(constructor)是與類同名的特殊成員函式,主要用於初始化物件的資料成員。定義形式如下:

class  x

建構函式的宣告和定義方法與類的其他成員函式相同,可以在類的內部定義建構函式,也可以先在類中宣告建構函式,然後在類外進行定義。在類外定義建構函式的形式如下:

x :: x(.....)

建構函式具有以下幾個特點:

(1)建構函式與類同名

(2)建構函式沒有返回型別,void也不行

(3)建構函式可以被過載

(4)建構函式由系統自動呼叫,不允許在程式中顯示呼叫它

(5)建構函式的呼叫時機是定義物件之後的第一時間,即建構函式是物件的第乙個被呼叫的函式

(6)定義物件陣列或用new建立動態物件時,也要呼叫建構函式。但定義陣列物件時,必須有無參建構函式

(7)建構函式通常應定義為共有成員(當然也可以定義為私有的,但不能被類外部訪問。單例模式就用到私有化的建構函式)

同時還需注意一下幾點:

(1)建構函式初始化列表中的成員初始化次序與它們在類中宣告的次序相同,與其在初始化列表中的次序無關。如:

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

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

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

//以上三個建構函式完全相同

(2)建構函式初始化列表先於建構函式體中的語句執行

(3)以下類成員必須使用成員初始化列表進行初始化:常量成員、引用成員、類物件成員、派生類建構函式對基類建構函式的呼叫

1.1預設建構函式

預設建構函式是指不需要顯示提供引數的建構函式。在某些情況下,必須使用預設建構函式來定義物件(如物件陣列)

如果乙個類沒有定義任何建構函式,在需要時編譯器將會為它生成乙個預設建構函式,它只負責建立物件,不做任何初始化工作。

在用預設建構函式建立物件時,如果建立的是全域性物件或靜態物件,則物件的位模式全為0(可以理解為將所有資料成員初始化為0);如果建立的是區域性物件,不進行物件資料成員的初始化,物件資料成員是未知的。

注意:只有在類沒有定義任何建構函式時,系統才會產生預設建構函式。一旦定義了任何形式的建構函式,系統將不再產生預設建構函式。

我們可以對預設建構函式進行重定義,來為物件的資料成員提供初始值。同時我們還可以為引數提供預設值。

1.2過載建構函式

過載建構函式必須具有不同的函式原型(即引數個數、引數型別或引數次序不能完全相同)

1.3複製建構函式

複製建構函式是乙個特殊的建構函式,用於根據已存在的物件初始化乙個新建物件。

如果沒有定義類的複製建構函式,在需要時,c++編譯器將產生乙個具有最小功能的預設複製建構函式,形式如:x::x(const x&){}

預設複製建構函式以成員按位複製(bit-by-bit)的方式實現成員的複製。按位複製就是把乙個物件各資料成員的值原樣複製到目標物件中。在沒有涉及指標型別的資料成員時,預設建構函式能夠很好地工作。但是,當乙個類有指標型別的資料成員時,預設複製建構函式常會產生指標懸掛問題。如果類存在指標型別的資料成員,就應該為他提供自定義的複製建構函式(也就是過載)

注意:複製建構函式的引數常常是const型別的本類物件的引用(x::x(const x&){})

2.析構函式

析構函式(destructor)是與類同名的另乙個特殊成員函式,作用於建構函式相反,用於在物件生存期結束時完成物件的清理工作。

析構函式的名字由「~」+「類名」構成,形式如下:

class x

析構函式具有以下特點:

(1)析構函式的名字是在類名前加上「~」,不能是其他名字

(2)析構函式沒有返回值型別(void也不行),沒有參數列

(3)析構函式不能過載,乙個類只能有乙個析構函式

(4)析構函式只能由系統自動呼叫,不能再程式中顯示呼叫析構函式

(5)若有多個物件同時結束生存期,c++按照與呼叫建構函式相反的次序呼叫析構函式

(6)每個類都應該有乙個析構函式,如果沒有顯示定義析構函式,c++將產生乙個最小化的預設析構函式(x::~x())

(7)建構函式和析構函式都可以是inline函式

(8)在通常情況下,析構函式應設定為公有成員

C 學習 構造 析構函式

一.建構函式 何時呼叫建構函式 class1 cl new class1 new運算子為物件分配記憶體,然後再呼叫物件的建構函式。1 建構函式 無返回值 與類同名,可以過載,在生成類的例項時呼叫,可以初始化字段,當然也可以加入 獲取目前生成的例項數 class mode 2 靜態建構函式 初始化靜態...

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...

C 建構函式,析構函式

一 建構函式 在建立類的物件時自動呼叫的乙個函式,主要是為物件本身做初始化工作 沒有返回值,名字和類的名字相同,因為是在建立物件時候自動呼叫的,所以必須型別為public的,可以帶引數,可以有多個 如果類中沒有建構函式,在下面三種情況下,會自動的新增預設的建構函式 1.如果類中有虛函式,或者類中有虛...