c 類基礎之建構函式與析構函式詳解

2021-10-10 01:14:44 字數 2065 閱讀 6246

「生而不同」之建構函式

建構函式的作用

在建立乙個新的物件時,自動呼叫的函式,用來進行「初始化」工作:

對這個物件內部的資料成員進行初始化。

建構函式的特點

1)自動呼叫(在建立新物件時,自動呼叫)

2)建構函式的函式名,和類名相同

3)建構函式沒有返回型別

4)可以有多個建構函式(即函式過載形式)

建構函式的種類

預設建構函式

自定義的建構函式

拷貝建構函式

賦值建構函式

預設建構函式

沒有引數的建構函式,稱為預設建構函式。

1.合成的預設建構函式

建構函式的函式名,和類名必須相同

但沒有手動定義預設建構函式時,編譯器自動為這個類定義乙個建構函式。

1)如果資料成員使用了「類內初始值」,就使用這個值來初始化資料成員。【c++11】

2)否則,就使用預設初始化(實際上,不做任何初始化)

注意:只要手動定義了任何乙個建構函式,編譯器就不會生成「合成的預設建構函式」

一般情況下,都應該定義自己的建構函式,不要使用「合成的預設建構函式」

【僅當資料成員全部使用了「類內初始值」,才宜使用「合成的預設建構函式」】

2.手動定義的預設建構函式

說明:如果某資料成員使用類內初始值,同時又在建構函式中進行了初始化,

那麼以建構函式中的初始化為準。

相當於建構函式中的初始化,會覆蓋對應的類內初始值。

自定義的過載建構函式

建構函式的函式名,和類名必須相同,且裡面有引數

建立物件時進行傳參

拷貝建構函式

1.手動定義的拷貝建構函式

假設在human定義乙個拷貝建構函式

訪問許可權必須為public

public

:human

(const human&

);

2.合成的拷貝建構函式

說明:合成的拷貝建構函式的缺點: 使用「淺拷貝」

解決方案:在自定義的拷貝建構函式中,使用『深拷貝

(例如類裡面有個屬性 char * name,進行淺拷貝時只是對值進行了拷貝,此時兩個物件的指標name共同指向一塊記憶體位址,進行深拷貝時為該物件開闢另乙個空間,使指標name指向另乙個位址)

什麼時候呼叫拷貝建構函式

1.呼叫函式時,實參是物件,形參不是引用型別

如果函式的形參是引用型別,就不會呼叫拷貝建構函式

2.函式的返回型別是類,而且不是引用型別

3.物件陣列的初始化列表中,使用物件

賦值建構函式

有以human類為例

賦值建構函式定義:human& human::operator=(const human &man);

如果沒有定義賦值建構函式,編譯器會自動定義「合成的賦值建構函式」,

與其他合成的建構函式,是「淺拷貝」(又稱為「位拷貝」)。

使用時注意一下淺拷貝問題

h1 和 h2分別為human物件

h2 = h1; //呼叫賦值建構函式

「最後的晚餐」之析構函式

作用:物件銷毀前,做清理工作。

具體的清理工作,一般和建構函式對應

比如:如果在建構函式中,使用new分配了記憶體,就需在析構函式中用delete釋放。

如果建構函式中沒有在堆空間申請資源(主要是記憶體資源),

那麼很少使用析構函式。

函式名:

~型別沒有返回值,沒有引數,最多只能有乙個析構函式

訪問許可權:

一般都使用public

使用方法:

不能主動呼叫。

物件銷毀時,自動呼叫。

如果不定義,編譯器會自動生成乙個析構函式(什麼也不做)

C 之建構函式與析構函式

首先,在棧裡宣告兩個物件bs sc,看看編譯器是如何自動呼叫的。includeusing namespace std class base base 執行結果顯示 first construct in base second construct in base construct in subcla...

C 之建構函式與析構函式

最近在學習c 每次看到繼承這段的時候,總是一邊感慨這門語言的難度,一邊感慨這門語言的神奇之處。最近看到了建構函式這段,問了自己這樣乙個問題,建構函式可以是虛函式嗎?不是很清楚,於是去查了一些資料。首先我覺得應該明確的乙個問題就是,虛函式的功能是c 中多型的一種實現方式。主要是繼承類的某些功能和基類的...

c 之建構函式與析構函式

建構函式 建構函式的原型和函式頭有乙個特徵 雖然沒有返回值,但沒有被宣告為void,實際上建構函式不允許宣告型別的。例子 stock stock const char co,int n,doublem 當建立物件初始化賦值有兩種方式 1.stock food stock adsfdsa 1,5.0 ...