C 基礎(4) 運算子過載

2021-10-16 13:05:02 字數 3373 閱讀 9183

二. 使用過載運算子

c++預定義中的運算子的操作物件只侷限於基本的內建資料型別,但是對於我們自定義的型別(類)是沒有辦法操作的。但是大多時候我們需要對我們定義的型別進行類似的運算,這個時候就需要我們對這麼運算子進行重新定義,賦予其新的功能,以滿足自身的需求。

運算子過載的實質就是函式過載或函式多型。運算子過載是一種形式的c++多型。目的在於讓人能夠用同名的函式來完成不同的基本操作。要過載運算子,需要使用被稱為運算子函式的特殊函式形式,運算子函式形式:operatorp() 後面的p為要過載的運算子符號

《返回型別說明符》

operator

《運算子符號》

(《參數列》

)

1.1 為什麼使用操作符過載?

對於系統的所有操作符,一般情況下,只支援基本資料型別和標準庫中提供的class,對於使用者自己定義class,如果想支援基本操作,比如比較大小,判斷是否相等,等等,則需要使用者自己來定義關於這個操作符的具體實現

比如,判斷兩個人是否一樣大,我們預設的規則是按照其年齡來比較,所以,在設計person 這個類的時候,我們需要考慮過載操作符==,而且,根據剛才的分析,比較的依據應該是age或者身高其他屬性

那麼為什麼叫過載呢?這是因為,在編譯器實現的時候,已經為我們提供了這個操作符的基本資料型別實現版本,但是現在他的運算元變成了使用者定義的資料型別class,所以,需要使用者自己來提供該引數版本的實現

1.2 c++哪些運算子允許過載

c++中絕大部分運算子都是可以被過載的

不能過載的運算子只有5個:

.成員訪問運算子

*成員指標訪問運算子

::域運算子

sizeof長度運算子

?:條件運算子

1.3 過載運算子的限制

只有c++預定義的操作符才可以被過載

對於內建型別的操作符,它的預定義不能改變,即不能改變操作符原來的功能過載操作符不能改變他們的操作符優先順序

例如」*「和」/「優先順序高於」+「和」-「,不論怎樣進行過載,各運算子之間的優先順序不會改變。有時在程式中希望改變某運算子的優先順序,也只能使用加括號的方法強制改變過載運算子的運算順序

過載操作符不能改變運算元的個數

如,關係運算子「>」和「<」等是雙目運算子,過載後仍為雙目運算子,需要兩個引數。運算子」+「,」-「,」*「,」&「等既可以作為單目運算子,也可以作為雙目運算子,可以分別將它們過載為單目運算子或雙目運算子。

過載運算子的函式不能有預設的引數

否則就改變了運算子引數的個數,與前面第4點矛盾。

過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有乙個是類物件(或類物件的引用)

也就是說,引數不能全部是c++的標準型別,以防止使用者修改用於標準型別資料成員的運算子的性質,如下面這樣是不對的:

int

operator+(

int a,

int b)

2.1 過載 自定義物件的+運算子
class

person

person

(string name,

int age,

int account)

person operator

+(person &p)};

intmain()

2.2 過載<<運算子
class

person

person

(string name,

int age,

int account)};

// << 只能全域性過載

ostream&

operator

<<

(ostream& cout,person &p)

intmain()

2.3 過載++i運算子
class

person

person

(string name,

int age,

int account)

// 年齡自增

person&

operator++(

)};int

main()

2.3 過載i++運算子
class

person

person

(string name,

int age,

int account)

// ++i

person&

operator++(

)// i++

person operator++(

int)};

intmain()

2.4 過載=運算子
class

person

person

(string name,

int*age,

int account)

void

operator

=(person & p)

this

->name = p.name;

this

->account = p.account;

this

->age =

newint

(*p.age);}

};intmain()

2.4 過載==運算子
class

person

person

(string name,

int age,

int account)

bool

operator

==(person & p)};

intmain()

2.5 過載()函式呼叫運算子

仿函式

class

person

person

(string name,

int age,

int account)

void

operator()

(string text)};

intmain()

C 基礎4(運算子過載)

可以重定義或過載大部分 c 內建的運算子。這樣,就能使用自定義型別的運算子。過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。使用全域性函式 使用類的成員函式 1 號運算子過載 使用全域性函式 include using namespace std...

C 基礎 運算子過載

運算子過載 返回值型別 類名 operator過載運算子 引數列表 include using namespce std class complex ostream operator ostream out,const complex c 過載輸出流 class complex complex pu...

C 基礎 運算子過載

一 運算子過載 1.類是使用者自定義的資料型別,使用運算子過載可以i實現如下邏輯 1 物件1 物件2 物件3,如描述複數的類,描述字串的類。2 提高程式的可讀性。2.過載賦值運算子 1 如果乙個類沒有提供賦值運算函式,則預設提供乙個。2 如果乙個類提供了拷貝建構函式,那麼也要提供乙個過載的賦值運算函...