類與物件總結2(6個預設成員函式)

2021-10-07 18:58:34 字數 3955 閱讀 1297

空類中並不是什麼都沒有,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。

建構函式主要完成初始化工作

析構函式主要完成清理工作

拷貝構造是使用同類物件初始化建立物件

賦值過載主要是把乙個物件賦值給另乙個物件

取位址運算子過載const取位址運算子過載建構函式是特殊的成員函式,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有乙個合適的初始值,並且在物件的生命週期內只呼叫一次。建構函式的主要任務是初始化物件,而不是開空間建立物件。

特徵:

1)函式名與類名相同

2)無返回值

3)物件例項化時編譯器自動呼叫對應的建構函式

4)建構函式可以過載

5)如果類中沒有顯示定義建構函式,c++編譯器會自動生成乙個無參的預設建構函式,一旦使用者顯式定義編譯器將不再生成

6)無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。注意:無參

建構函式、全預設建構函式、我們沒寫編譯器預設生成的建構函式,都可以認為是預設成員函式。

3.**測試

class

date

//帶參建構函式

date

(int year,

int month,

int day)

//全預設值的建構函式(預設建構函式)

date

(int year =

2000

,int month =4,

int day =21)

//半預設值的建構函式

date

(int year,

int month,

int day =21)

private

:int _year;

int _month;

int _day;};

void

test()

析構函式與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的,而物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作

特徵:

1)析構函式名 ~類名

2)無參無返回值

3)乙個類有且只有乙個析構函式。若未顯式定義,系統會自動生成預設的建構函式

4)物件生命週期結束時,c++編譯器自動呼叫析構函式

5)編譯器生成的預設析構函式,對會自定型別成員呼叫它的析構函式,即如果乙個類沒有涉及到資源管理時,析構函式可以不寫

**測試

typedef

int datatype;

class

seqlist

~seqlist()

}private

:int

* _pdata;

size_t _size;

size_t _capacity;};

void

testdate()

拷貝建構函式只有單個形參,該形參是對本類型別物件的引用(一般常用constant修飾),在用已存在的類型別物件建立新物件時由編譯器自動呼叫

特徵1)拷貝建構函式是建構函式的乙個過載形式

2)拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式,傳參期間要構造臨時物件,就要呼叫拷貝建構函式,所以會引發無窮遞迴呼叫

3)若未顯示定義,系統生成預設的拷貝建構函式。 預設的拷貝建構函式物件按記憶體儲存按位元組序完成拷貝,這種拷貝我們叫做淺拷貝,或者值拷貝

淺拷貝後果:兩個物件會使用同乙份資源,在物件銷毀時會導致乙份資源釋放多次而引起**崩潰,所以類中涉及到資源管理時,必須顯示定義拷貝建構函式,否則就會造成淺拷貝

4)如果乙個類沒有涉及到資源管理,則該類的拷貝建構函式可以不用顯示定義,使用編譯器生成的預設拷貝建構函式即可

**測試

class

date

//這裡的析構函式可以不用給出,因為沒有涉及到資源管理

date

(const date &d)

//一般不會用形參改變實參,所以要用const

void

printdate()

private

:int _year;

int _month;

int _day;};

void

testdate()

運算子過載

c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。

函式名字為:關鍵字operator後面接需要過載的運算子符號。

函式原型:返回值型別 operator操作符(引數列表)

注意:1)不能通過連線其他符號來建立新的操作符:比如operator@

2)過載操作符必須有乙個類型別或者列舉型別的運算元

3)用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不能改變其含義

4)作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的

操作符有乙個預設的形參this,限定為第乙個形參

5).* 、:: 、sizeof 、?: 、. 注意以上5個運算子不能過載。這個經常在筆試選擇題**現

**測試

class

date

date

(const date &d)

void

printdate()

//過載 > ,該運算子需要兩個引數,但是作為類成員函式時,只需給出乙個引數即可,因為成員函式還有乙個隱藏的this指標

bool

operator

>

(const date& d)

private

:int _year;

int _month;

int _day;};

intmain()

else

return0;

}

class

date

date

(const date &d)

void

printdate()

//前置++

date&

operator++(

)//後置++

//因為temp是函式棧上的物件,函式執行結束後,該物件就被銷毀了,因此不能按照&的方式返回

date operator++(

int)

//如果引數型別相同就無法構成函式過載,編譯器為了區分而加上的引數

private

:int _year;

int _month;

int _day;};

intmain()

賦值運算子過載

class

string

~string()

}private

:char

* _str;};

void

teststring()

class

date

date (

const date& d)

date&

operator=(

const date& d)

return

*this;}

private

:int _year ;

int _month ;

int _day ;

};

這兩個預設成員函式一般不用重新定義 ,編譯器缺省會生成

類和物件(預設成員函式)

建構函式不是開空間建立物件,而是初始化物件,更嚴謹的說是賦初值 特性初始化列表 class date private int year int month int day explicit 析構函式不是完成對物件的銷毀,區域性物件銷毀由編譯器完成,而在物件銷毀時會呼叫析構函式,完成類的一些資源清理工...

C 類與物件之預設成員函式

所有類建立物件時會自動生成六個預設函式。但有時候預設函式不能滿足需求,可以自己建立對應函式,來代替預設函式。初始化和清理 建構函式 析構函式 拷貝複製 賦值過載函式 拷貝建構函式 const物件取位址過載class date date private int year int mouth int d...

類和物件(2) 預設成員函式

在前面我詳細介紹了類和物件的一些基本語法,類和物件 1 在本章部落格中繼續深入討論類的六個預設成員函式。如果乙個類中什麼成員都沒有,簡稱為空類。空類中什麼都沒有嗎?並不是的,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。一 建構函式 class date date int year...