二、拷貝構造
三、 析構函式
建構函式函式名與類名相同,無返回值型別(void也不可以),在建立物件時自動執行。
#include
using
namespace std;
class
person
;//定義建構函式
person::
person()
person::
person
(char
*name,
int age)
//定義普通成員函式
void person::
show()
intmain()
建構函式應為共有屬性,否則在建立物件時就無法呼叫該建構函式。
建構函式的作用是給類中的成員賦值,呼叫該建構函式,只需要在建立物件的同時傳參賦值,就像上例建立的物件p1,p2.只不過在棧上建立物件時,實參位於物件名後面,在堆上建立物件時,實參位於類名後面。
建構函式是可以過載的,就像上例中的建構函式過載,乙個該有形參,乙個沒有形參。
建構函式的呼叫是強制性的,**一旦在類中定義了建構函式,那麼建立物件時就一定要呼叫,不呼叫是錯誤的。**如果有多個過載的建構函式,那麼建立物件時提供的實參必須和其中的乙個建構函式匹配,這也就意味著,建立物件時只有乙個建構函式會被呼叫。
在呼叫帶形參的函式時,需要在建立物件時,傳遞實參;而在呼叫沒有引數的構造時,可以直接建立物件,並且不用加(),這就表示呼叫的是不帶引數的構造。
在c++類中會存在著乙個預設建構函式,如果程式設計師在類的成員中沒有編寫建構函式,那麼系統會自動生成空的建構函式體,儘管這個函式不執行任何操作。
乙個類必須有建構函式,要麼使用者自己定義,要麼編譯器自動生成。
如果使用者自己定義了建構函式,那麼編譯器便不再自動生成建構函式。
#include
using
namespace std;
class
person
;//採用初始化列表
person::
person
(char
*name,
int age)
:m_name
(name)
,m_age
(age)
void person::
show()
intmain()
初始化列表的作用是對類內的成員變數進行初始化,寫法如上例,是在函式首部與函式體之間新增了乙個冒號:
,隨後用類內成員(形參)
的寫法,表示將形參值傳遞給該類內成員。初始化列表可以用於全部成員變數,也可以只用於部分成員變數,用於部分成員變數時,只需要在:
後,寫出所要初始化的變數即可。
成員變數的初始化順序與初始化列表中列出的變數的順序無關,它只與成員變數在類中宣告的順序有關。
初始化列表還有乙個作用是給const成員變數賦值,初始化 const 成員變數的唯一方法就是使用初始化列表。
拷貝構造是建構函式的延伸,拷貝構造 是一種特殊的建構函式 ,用自身這種型別來構造自身
使用者未定義拷貝構造,系統預設提供乙個隱式的拷貝構造,它會將已存在於物件中的資料成員逐個的拷貝到新建立的物件中(淺拷貝)
拷貝構造:類名 (const 類名& 引用名)
;
如果類中存在動態申請記憶體,就必須要重寫拷貝構造,來做深拷貝。不然兩個類中的指標會指向同乙個位址,在釋放的時候會造成錯誤。
淺拷貝:如果要拷貝的物件內存在動態申請的記憶體,那麼淺拷貝之後,新物件的指標指向要拷貝的物件的記憶體位址。
深拷貝:如果要拷貝的物件內存在動態申請的記憶體,那麼呼叫深拷貝建構函式,為新物件申請記憶體,並儲存資料。
class
student
;student::
student
(const
char
*name)
student::
student
(const student& stu)
void student::
show()
student::
~student()
}int
main()
在存在動態記憶體申請的時候,需要呼叫拷貝函式,否則執行析構函式,釋放記憶體時,前乙個指標釋放記憶體後,後乙個指標沒有記憶體可以釋放,會引發異常。
建立物件時系統會自動呼叫建構函式進行初始化工作,同樣,銷毀物件時系統也會自動呼叫乙個函式來進行清理工作,這個函式就是析構函式。
#include
using
namespace std;
class
student
;student::
student
(int a,
int b)
:m_a
(a),
m_b(b)
student::
~student()
intmain()
上例可見析構函式的形式:~類名(){}
析構函式沒有引數,不能被過載,乙個類只能有乙個析構函式。如果使用者沒有定義,編譯器會自動生成乙個預設的析構函式。
析構函式的呼叫條件:
在所有函式之外建立的物件是全域性物件,它和全域性變數類似,位於記憶體分割槽中的全域性資料區,程式在整體結束執行時會呼叫這些物件的析構函式。
在棧區系統開闢的記憶體,系統會自動釋放並呼叫析構函式。
在堆區手動開闢的記憶體,手動delete釋放時,才會呼叫析構函式
C 建構函式 拷貝構造 析構函式
建構函式 constructor 在例項物件時,系統自動呼叫,用來初始化物件的資料成員 建構函式宣告語法 類名 引數列表 建構函式注意點 include include using namespace std class computer 上面的建構函式也可以寫成引數列表初始化的形式 compute...
C 建構函式 析構函式 拷貝建構函式
建構函式 析構函式 拷貝建構函式 如果類成員變數有初始值,用這些初始值初始化成員變數 如果類成員變數沒有初始值,則預設初始化該成員變數 class student int main 使用注意事項 語法 這個預設建構函式之所以對student有效,是因為我們為內建型別的資料成員提供了初始值 如果你的編...
建構函式 拷貝建構函式 析構函式
1.如果定義了兩個預設建構函式,vc只回給出warning.2.如果有預設引數的預設構造,如果你給了第乙個預設的話 所有傳遞引數都要有預設植 否則報錯.不過如果是第乙個引數的預設值沒有給出的話,編譯器卻看不出問題,但是沒有 試過這種情況建構函式能不能正常工作.建構函式 用來初始化物件的資料成員,與類...