C 類與物件(中)

2021-09-09 06:17:21 字數 3018 閱讀 9467

類六個預設函式包括構造、拷貝構造、析構、賦值運算子過載、取位址操作符過載、const修飾的取位址操作符過載,預設生成

建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員

都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次

特性如下

1. 函式名與類名相同。

2. 無返回值。(也沒有void返回值)

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

4. 建構函式可以過載

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

義編譯器將不再生成。

構造出的物件元素為隨機值

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

class a

a()}

上面的**會編譯錯誤,因為程式無法判斷,當設定乙個無引數傳遞的物件呼叫哪乙個建構函式。

小知識點:c++把型別分成內建型別(基本型別)和自定義型別。內建型別就是語法已經定義好的型別:如int/char...,自定義型別就是我們使用class/struct/union自己定義的型別,編譯器生成預設的建構函式會對自定型別成員t呼叫的它的預設成員如下

#include using namespace std;

class a

//值傳遞

//需要給 形參賦值,呼叫拷貝函式

a(a a1)//上乙個的形參

//值傳遞給 形參的形參 賦值,呼叫拷貝函式

a(a a1)

//值傳遞給 形參的形參 的形參賦值,呼叫拷貝函式

a(a a1)

//值傳遞給 形參的形參 的形參 的形參賦值,呼叫拷貝函式

a(a a1)

//值傳遞給 形參的形參 的形參 的形參 的形參賦值,呼叫拷貝函式

根據邏輯,有時候需要比較兩個物件的大小或其他屬性,但是c++不支援自定義型別的物件的比較大小等操作需要過載運算子,

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

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

但是過載需要注意以下幾點

1.過載無法創造新的運算子如@等

2.過載運算元至少有乙個類型別或者聯合型別

3.無法過載內建型別(int,char等)的操作符

4.共有5個操作符無法過載:.* 、:: 、sizeof 、?: 、. (注意第乙個是點*而不是*)

例子如下為對日期的過載:為初始版本十分臃腫,精簡的方法為函式的復用:具體看

這裡:

#include using namespace std;

class date

;if (month == 2 && year%4 == 0&&year%100 !=0||year%400 ==0)

return 29;

else

return montharray[month];

} date(int year = 2019, int month = 1, int day = 1)

// 四個成員函式

else }

print()

if(_month!=0)

if(_month==0)

}return *this;};

date &operator-=(int day)

_day+=getmonthday( _year, _month);

}return *this;

};// 前置

date operator++()

;date operator--()

;// 後置返回 改變量值之前的物件乙個拷貝,

date operator++(int)

;date operator--(int)

;// d1-d2

void print()

~date()

如果設定乙個date型別的物件,並用&訪問它的位址會返回00000000.

將const修飾的類成員函式稱之為const成員函式,const修飾類成員函式,實際修飾該成員函式隱含的this

指標,表明在該成員函式中不能對類的任何成員進行修改。以上面的**為例

相當於將隱含的this指標形參由date *轉化為了 const date *

1.const物件可以呼叫非const成員函式嗎?

答:不可以,非const成員函式形參為非const型別,傳參時編譯器試圖將const型別的指標轉化成非const型別,無法實現操作。

2. 非const物件可以呼叫const成員函式嗎?

答:可以,允許非const變數轉化為const變數,this指標的型別可以轉化。

3. const成員函式內可以呼叫其它的非const成員函式嗎?

答:不可以,呼叫非const成員函式,就可能對const變數進行修改,這是不允許的,

c++規定 const成員函式內不能呼叫其它的非const成員函式

4. 非const成員函式內可以呼叫其它的const成員函式嗎?

答:可以,理由和第二題相同

(注意唯一的例外是析構函式,c++標準中說

a destructor can be invoked for a const, volatile or const volatile object.

析構函式可以為const、volatile或const volatile物件呼叫析構函式。

因為析構函式和資源的**有關,如果無法訪問const函式就會造成記憶體洩漏)

const也可以用來過載函式

class a{

private:

int i;

public:

void f()

{cout<<"f()"(注意const寫在形參括號的右邊,如果寫在了函式名的左邊,編譯器會認為函式返回型別為const,如果是對void修飾,函式本身依然沒有返回值)

C 類與物件(中)

類與物件 上 對類的定義 類的作用域 類的物件模型 this指標等進行了相關介紹,下面我們將對類的6個預設成員函式進行詳細的介紹 2.1 建構函式的定義 建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼...

C 中的類與物件

什麼是類與物件?類是一種抽象化的資料型別,一般而言,它包括資料與處理資料的函式這兩大部分。而物件則是對某一類的例項。例如 class cmyclass cmyclass為類 cmyclass myclass myclass為物件1.類的定義與特點 類的定義示例如下 class cmyclass 各個...

c 中的類與物件

我們都知道,在c語言中,結構體是指一系列相同型別或者不同型別的資料構成的資料集合。在c語言中我們將結構體定義為 struct student 而我們知道,在c語言中,資料 和 處理資料的操作 函式 是分開的,語言本身並沒有支援 資料和函式 之間的關聯性。所以在c語言的結構體中,只能存放資料,定義變數...