C 學習筆記 二 建構函式和析構函式

2021-10-23 07:39:18 字數 3607 閱讀 2832

我的部落格:竹山聽雨

方法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)

;

方法4
student 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 利用了建構函式和析構函式來解決成員變數初始化和銷毀清理工作,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。物件的初始化和清理工作是編譯器強制要求我們做的事情,因此如果我們不提供建構函式和析構函式,編譯器會給我們提供預設的建構函式和析構。編譯器所提供的...