(一二二)運算子過載 第十一章

2021-09-23 22:52:17 字數 3672 閱讀 2724

本章重點是類設計技術,而不是通用原理。

c++的重點是

多使用。

運算子過載是一種形式的c++

多型(就像函式過載那樣,同名但呼叫不同的函式)。

要過載運算子,需要使用被稱為運算子函式的特殊函式形式。運算子函式格式如下:

operator

運算子 

(argument-list);

例如:operator +(); 表示過載加號運算子,而operator -()表示過載減號運算子。

其中,運算子必須是有效的c++

運算子,而不是是自己捏造的(例如

+-*/

之類就是有效的,而

@就是無效的)。

但需要注意的是,定義運算子有時需在類中定義(非必須,具體看下面的運算子過載的限制),對該類物件有效。運算子前面是的呼叫該方法的物件,引數中是被呼叫的物件。

例如:

class mm

}

這裡實際上就是把+

號運算子過載為對物件有用的加號運算子了。

如**:

#include#includeclass skill	//技能類

//預設建構函式,預設機率和傷害都為0

void show();

skill operator +(const skill&b); //技能融合函式,將2個技能融合起來變成第三個技能

};int main()

void skill::show()

skill skill::operator+(const skill&b)

輸出:

技能:拔刀斬 的發動機率為 20 %,傷害為: 500 點。

技能:半月斬 的發動機率為 15 %,傷害為: 400 點。

技能已融合!新技能get!

技能:拔刀斬 的發動機率為 43.75 %,傷害為: 700 點。

請按任意鍵繼續. . .

總結:①運算子過載的關鍵,是運算子左邊的呼叫過載函式,右邊的作為引數,所以在碼**的時候,需要注意順序。

例如,one+two

時,按照類方法,新物件

three

是one

的名字,如果是

two+one

,新物件

three

是two

的名字。

當然,具體是什麼,根據函式定義來決定。

運算子過載的限制:

多數c++

運算子(參見表

11.1

,如下圖,不過看不清……)都可以用這樣的方式過載。

ps:圖看不清,不傳了。具體請看書(最好看實體書,pdf版不是很清楚,不過大部分都可以過載)

但也有一些限制,例如:過載的運算子不必是成員函式,但必須至少有乙個運算元是使用者定義的型別。

具體限制如下:

①過載後的運算子,必須至少有乙個運算元是使用者定義的型別(否則不知道你使用的是運算子過載,在運算子過載的函式定義裡,也容易出問題),這將防止使用者為標準型別過載運算子。

因此,不能把減法運算子過載為2

個標準型別(如

int或者

double

)的值的和,而不是他們的差。

②使用運算子時不能違反運算子原來的句法規則。例如,+-*/以及%

這五種運算子,需要兩個數來參與。你不能只給他用乙個數。例如

a+b是可以的,但是

+a這種是不行的。而像位址運算子

&就是只對乙個數使用,如

&dizhi。

另外,運算子即使被過載,其運算優先順序也與原來的運算子的優先順序相同,例如a+b/c,即使對+

進行運算子過載,也依然是先計算

b/c,再計算a+ (b/c)的結果。

③不能建立新的運算子,只能用已有的

④不能過載下面的運算子。(1)

sizeof   sizeof

運算子

(2).  ←這是乙個句號,成員運算子,比如結構名.

結構內變數

(3).*    

←句號和乘號,成員指標運算子(沒見過)

(4):: ←兩個冒號,作用域解析運算子

(5)?: 條件運算子,比如: a>b?c:d(6)

typeid ←乙個rtti

運算子(沒見過)

(7)const_cast ←強制型別轉換運算子(沒見過這種用法)

(8)dynamic_cast ←強制型別轉換運算子(沒見過這種用法)

(9)reinterpret_cast ←強制型別轉換運算子(沒見過這種用法)

(10)static_cast ←強制型別轉換運算子(沒見過這種用法)

而上面那個中的運算子,基本都可以用(反正大部分都能用,不能用的是少數)。

⑤大部分運算子:可以通過成員、非成員函式進行過載;

以下幾個運算子,只能通過成員函式進行過載:(1)

= ←賦值運算子

(2)() ←函式呼叫運算子

(3) ←下標運算子(為什麼叫下標?)

(4)-> ←通過指標訪問類成員的運算子(不懂,是指

this->

私有成員這樣麼?)

⑥運算子過載最好遵循一般邏輯,例如不要把加法運算子(+

)過載為兩個物件各個值的差這種違反直覺的事情。

⑦過載運算子面對不同物件時,需要定義不同型別的過載運算子函式。

例如,乙個物件 + 

另乙個物件,和乙個物件 

+ 乙個

int值

/double

值,是不能使用同乙個函式的。

如**:

#include#includeclass skill	//技能類

//預設建構函式,預設機率和傷害都為0

void show()const;

skill operator +(const skill&b)const; //技能融合函式,將2個技能融合起來變成第三個技能

void operator*=(const double &b); //技能增強函式,過載運算子*=

void operator/=(const double &b); //另一種形式的增強,通過降低概率增加傷害,過載運算子/=

};int main()

void skill::show()const

skill skill::operator+(const skill&b)const

void skill::operator*=(const double &b)

void skill::operator/=(const double &b)

輸出:

技能:拔刀斬 的發動機率為 20 %,傷害為: 500 點。

技能:半月斬 的發動機率為 15 %,傷害為: 400 點。

技能已融合!新技能get!

技能:拔刀斬 的發動機率為 43.75 %,傷害為: 700 點。

現將增強你的技能,增強發動機率和傷害,增加比例為1.5。

技能:拔刀斬 的發動機率為 65.625 %,傷害為: 1050 點。

現在將降低概率,增強傷害,係數為:2

技能:拔刀斬 的發動機率為 32.8125 %,傷害為: 2100 點。

bye.

請按任意鍵繼續. . .

第十一章運算子過載

1 運算子過載 include using namespace std class num num int get const void set int x private int n int main num int get const void set int x void add privat...

C 程式語言 第十一章 運算子過載

1 運算子函式 運算子函式的名字是由關鍵字operator後跟對應的運算子構成。二元運算子可以定義為取乙個引數的非靜態成員函式,也可以定義為去兩個引數的非成員函式。乙個運算子函式必須或者是乙個成員函式,或者至少有乙個使用者定義型別的引數。不存在運算子遮蔽,這就保證了內部運算子可以用,並且為運算子定義...

第十一周 實現類中的運算子過載

檔名稱 text.cpp 完成日期 2015年5月16日 版本號 v1.0 問題描述 請用類的成員函式定義複數類過載運算子 使之能用於複數的加減乘除 輸入描述 無 程式輸出 複數類加減乘除之後的結果 include using namespace std class complex complex ...