我的部落格:竹山聽雨
方法4深拷貝建構函式和淺拷貝建構函式
建構函式對資料成員的初始化
類型別和基本資料型別的轉換
析構函式
當建立乙個物件時,物件的狀態(資料成員的取值)是不確定的。建構函式是c++中乙個特殊的成員函式,它可自動進行物件的初始化。而析構函式在物件撤銷時執行清理任務,進行善後處理
特性
物件的初始化是指物件資料成員的初始化,在使用物件前,一定要初始化,但因為資料成員一般為私有的(private),所以不能直接賦值。
一種方法是類中提供乙個普通成員函式來初始化,但是可能會造成使用不便(使用物件前必須顯式呼叫該函式)和不安全(未呼叫初始化函式就使用)
另一種方法就是使用了建構函式對物件進行初始化。
定義:建構函式是乙個與類同名,沒有返回值的特殊成員函式。建構函式既可在類外定義,也可以作為內聯函式在類內定義。
使用:在定義該類物件時,可以將引數傳遞給建構函式來初始化物件。一般用於初始化類的資料成員,每當建立乙個物件時(包括用new動態建立),會自動呼叫建構函式
宣告:《類名》::建構函式
//類內定義
class student..
.}//類外定義
class student
student:
:student
(int id,string name)
//呼叫:
intmain()
注意:建構函式也可以進行過載,建構函式也可以使用預設引數
預設建構函式(預設構造物件)
功能:預設構造引數是個無參建構函式,它僅負責建立物件,而不做任何初始化
背景:c++規定,每個類必須有乙個建構函式,沒有建構函式,就不能建立任何物件。若使用者未顯式定義乙個類的建構函式,則提供給乙個預設的建構函式
eg:
class test
test:
:test()
test:
:test()
intmain()
建立物件陣列test stu[5]
=
拷貝建構函式(複製建構函式)
功能:是用乙個已有的物件來初始化乙個被建立的同類物件,是一種特殊的建構函式,具有一般建構函式的所有特性
特點:其形參是本類物件的引用
宣告:類名(類名& 物件名)
class student
student:
:student
(student &other)
以下四種情況會自動呼叫拷貝建構函式
方法1
student s1;
student s2
(s1)
;
方法2
用類的乙個物件去初始化另乙個物件的
student s2=s1;
方法3
物件作為函式引數傳遞時,呼叫拷貝建構函式
void
f(student a)
//定義f函式,形參為student類物件
student b;
f(b)
;
方法4student f()
//定義f函式,返回值為student類物件
student b;b=f
();
深拷貝建構函式和淺拷貝建構函式
區別:
預設提供的構函式只是對物件進行淺拷貝
一般情況下,只需要使用系統提供的淺拷貝建構函式即可,但是如果物件的資料成員包括指向堆空間的指標,就不能使用這種拷貝方式,因為兩個物件都擁有乙個同乙個資源,因此必須自定義建構函式
條件:
class test..
.}test
(test& p)
//深拷貝建構函式}~
test()
//析構函式
private:
char
* name;
}int
main()
當在main()
中呼叫了深建構函式,如果卻沒有定義深建構函式,就會預設呼叫預設的淺拷貝建構函式,就會發生報錯
當資料成員有使用new
動態分配記憶體空間,在析構函式中使用delete
進行動態記憶體空間的釋放以及賦值=運算子進行過載,應該自定義深拷貝建構函式
建構函式對資料成員的初始化
建構函式可以採用以下幾種不同的形式對資料成員進行初始化
在建構函式的函式體中進行初始化
void
test
(int sid,string sname)
使用構造初始化表對資料成員進行初始化《類名》 ::《建構函式》(《參數列》):《變數1>(《初值1),....《變數n>(《初值n>)
注意:
class test
private:
int id;
string name;
}
類型別和基本資料型別的轉換
建構函式用作型別轉換
前提:此類一定是只帶乙個引數的建構函式
class a
類型別轉換函式
在函式體中宣告
operator type();
type為要轉換的基本型別名,既沒有引數也沒有返回型別,但是在函式體重必須具有乙個type型別的物件
定義轉換函式的函式體
類名::opertor type()
使用型別轉換函式
功能:當物件被撤銷時,釋放該物件占用的空間
作用:當物件消亡時,系統將自動呼叫析構函式,執行一些在物件撤銷前必須執行的清理任務
特點:
自動呼叫的三種情況:
析構函式的手工呼叫
物件名.類名::析構函式名
析構函式與建構函式的呼叫順序
先構造後析構
class a
a(a & s)
//拷貝建構函式~a
()..
.}intmain()
c 學習筆記 建構函式和析構函式
一 建構函式作用 幫助我們初始化物件 給物件的每個屬性依次的賦值 建構函式是乙個特殊的方法 建構函式沒有返回值,連 void 也不能寫。建構函式的名稱必須跟類名一樣。建立物件的時候會執行建構函式建構函式是可以有過載的。類當中會有乙個預設的無引數的建構函式,當你寫乙個新的建構函式之後,不管是有引數的還...
C 學習 建構函式和析構函式
當建立物件的時候,這個物件應該有乙個初始狀態 當物件銷毀之前應該銷毀自己建立的一些資料。c 中的解決方案,建構函式和析構函式,這兩個函式將會被編譯器自動呼叫,完成物件初始化和物件清理工作 不管有沒有我們有沒有提供初始化操作和清理操作,編譯器也會增加預設的操作,只是這個預設初始化操作不會做任何事,所以...
C 學習筆記之建構函式和析構函式
c 學習筆記之建構函式和析構函式 c 利用了建構函式和析構函式來解決成員變數初始化和銷毀清理工作,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。物件的初始化和清理工作是編譯器強制要求我們做的事情,因此如果我們不提供建構函式和析構函式,編譯器會給我們提供預設的建構函式和析構。編譯器所提供的...