「生而不同」之建構函式
建構函式的作用
在建立乙個新的物件時,自動呼叫的函式,用來進行「初始化」工作:
對這個物件內部的資料成員進行初始化。
建構函式的特點
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 ...