c 構造及拷貝構造 析構函式的複習整理

2021-10-05 18:12:22 字數 2903 閱讀 6202

二、拷貝構造

三、 析構函式

建構函式函式名與類名相同,無返回值型別(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.如果有預設引數的預設構造,如果你給了第乙個預設的話 所有傳遞引數都要有預設植 否則報錯.不過如果是第乙個引數的預設值沒有給出的話,編譯器卻看不出問題,但是沒有 試過這種情況建構函式能不能正常工作.建構函式 用來初始化物件的資料成員,與類...