本章重點是類設計技術,而不是通用原理。
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 ...