類與物件(中篇)

2021-09-25 16:19:49 字數 4149 閱讀 3628

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

概念建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次。 特性

建構函式是特殊的成員函式,需要注意的是,建構函式的雖然名稱叫構造,但是需要注意的是建構函式的主要任務並不是開空間建立物件,而是初始化物件。

其特徵如下:

1. 函式名與類名相同。

2. 無返回值。

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

4. 建構函式可以過載。

class

date

// 2.帶參建構函式

date (

int year,

int month ,

int day )

private

:int _year ;

int _month ;

int _day ;};

void

testdate()

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

class

date

*/private

:int _year;

int _month;

int _day;};

void

test()

6. 無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。注意:無參建構函式、全預設建構函式、我們沒寫編譯器預設生成的建構函式,都可以認為是預設成員函式。

// 預設建構函式

class

date

date (

int year =

1900

,int month =1,

int day =1)

private

:int _year ;

int _month ;

int _day ;};

// 以下測試函式能通過編譯嗎?

void

test()

7. 成員變數的命名風格

class

date

private

:int year;};

// 所以一般建議如下寫**

class

date

private

:int _year;};

// 或者這樣。

class

date

private

:int m_year;};

// 其他方式也可以的,一般都是加個字首或者字尾標識區分

概念

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

析構函式是特殊的成員函式。

其特徵如下:

1. 析構函式名是在類名前加上字元 ~。

2. 無引數無返回值。

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

4. 物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。

typedef

int datatype;

class

seqlist

~seqlist()

}private

:int

* _pdata ;

size_t _size;

size_t _capacity;

};

5. 編譯器生成的預設析構函式,對會自定型別成員呼叫它的析構函式。

s string	~

string()

private

:char

* _str;};

class

person

;int

main()

概念

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

拷貝建構函式也是特殊的成員函式,其特徵如下:

1. 拷貝建構函式是建構函式的乙個過載形式。

2. 拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

class

date

date

(const date& d)

private

:int _year;

int _month;

int _day;};

intmain()

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

class

date

private

:int _year;

int _month;

int _day;};

intmain()

4. 自己實現拷貝建構函式

// 這裡會發現下面的程式會崩潰掉?這裡就需要我們以後講的深拷貝去解決。

class

string

~string()

private

:char

* _str;};

intmain()

運算子過載

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

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

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

注意:

// 全域性的operator==

class

date

//private:

int _year;

int _month;

int _day;};

// 這裡會發現運算子過載成全域性的就需要成員變數是共有的,那麼封裝性如何保證?

bool

operator==(

const date& d1,

const date& d2)

void test (

)class

date

// bool operator==(date* this, const date& d2)

// 這裡需要注意的是,左運算元是this指向的呼叫函式的物件

bool

operator==(

const date& d2)

private

:int _year;

int _month;

int _day;};

void test (

)

賦值運算子過載
class

date

date (

const date& d)

date&

operator=(

const date& d)

}private

:int _year ;

int _month ;

int _day ;

};

賦值運算子主要有四點:

引數型別

返回值檢測是否自己給自己賦值

返回*this

乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝。

class

date

private

:int _year;

int _month;

int _day;};

intmain()

const修飾類的成員函式

類與物件 中篇

1 類的6個預設成員函式 2 建構函式 1 概念 乙個特殊的成員函式,名字與類名相同,建立類型別物件的時候,由編譯器自己呼叫,在物件的生命週期中且呼叫一次,以保證每個資料成員都有乙個合適的初始值 2 建構函式的特性 class date test.cpp 無參建構函式 date date 帶參建構函...

程式設計師成長之旅 類和物件中篇

析構函式 拷貝建構函式 賦值運算子過載 const成員 取位址及const取位址運算子過載 如果乙個類中什麼都沒有,我們都知道它是空類,但是空類是不是什麼事情都不做,答案當然是否定的,它會生成6個預設函式。概念建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資...

類與物件 物件

一 什麼是物件?1.物件是由我們自己建立的類來建立出來的。2.物件就是類的例項 可以真正使用類的資料,可以呼叫類中元素的資料 3.乙個類可以建立出多個物件 二 如何建立物件?1.保證用來建立物件的類是存在 2.需要通過類中提供的構造方法建立物件 格式 new 構造方法 引數值 三 建立好的物件的有何...