一、操作符函式
在c++中,編譯器有能力把乙個由資料、物件和操作符共同組成的表示式,解釋為對乙個全域性或成員函式的呼叫。
該全域性或成員函式被稱為操作符函式,通過重定義操作符函式,可以實現針對自定義型別的運算法則,並使之與內建型別一樣參與各種表示式。
二、雙目操作符表示式
成員函式
形如l#r雙目操作符表示式,將被編譯器解釋為 l.operator#(r)
a-b+c == a.operator-(b).operator+(c)
全域性函式
形如l#r的雙目操作符表示式,將被編譯器解釋為 ::operator#(l,r)
a-(b+c) == ::operator-(a,::operator+(b,c))
三、單目操作符表示式
成員函式
形如#o或o#的單目操作表示式,將被編譯器解釋為 o.operator#(),唯一的運算元是呼叫物件。
全域性函式
形如#o或o#的單目操作表示式,將被編譯器解釋為 ::operator#(o),唯一的運算元是呼叫物件。
以下所有過載的**例項
1 #include 2point過載所有運算子using
namespace
std;34
56struct
point 717
18 point(point &that)
1923
24 point &operator = (point &that)
2529
30void
show()
3134
35 point operator - (point &that)
3642
43 point operator +(point &that)
4450
51/*
5253
point& operator --(void)
5459
6061
point operator --(int)
6268
6970
*/71
72int
operator (int
index)
7376
77/*
78point operator *(point &that)
7985
86*/
87 friend point operator %(point &p1,point &p2);
88 friend point operator *(point &p1,point &p2);
89 friend point &operator --(point &p1);
90 friend point operator --(point &p1,int
);91 friend istream & operator >> (istream &is,point &p1);
9293
94};
9596
9798 point operator %(point &p1,point &p2)
99103
104 point operator *(point &p1,point &p2)
105110
111112 point &operator --(point &p1)
113118
119 point operator --(point &p1,int
)120
126127
128 istream & operator >> (istream &is,point &p1)
129132
133134
135136
intmain()
137
四、典型的雙目運算子過載
成員函式
1 point operator /+-*%|^& (point&that)注意:原物件的值不變,要產生乙個臨時的物件2
1注意:運算子的過載要符合情理。bool
operator > < >= <= == != || && (point&that)25
6 point& operator += -= *= /= (point&that)
7
全域性函式
可能會訪問到引數的私有成員:
1、把成員變成公開,但會破壞類的封閉性。
2、把全域性函式宣告為友元(友元不是成員),
3、不能在友元函式中直接訪問成員變數。
1 point operator + (point& a,point&b)五、典型的單目運算子過載2
成員函式:
前++/--
1 point& operator ++/-- (void)2後++/--
1 point operator ++/-- (int)2全域性函式:
前++/--
1 point& operator ++/-- (point&)後++/--25
1 point operator ++/-- (point&,int)2六、輸入、輸出運算子過載5
輸入、輸出運算子不能過載為成員函式,只能是友元。
1 ostream& operator七、特殊的運算子的過載<< (ostream& os,point&p)25
6 istream& operator >> (istream& is,point&p)
7
下標運算子,可以把物件當作陣列來使用。
() 函式運算子,可以把物件當作函式來使用。
-> 成員訪問運算子,可以把物件當作指標來使用。
* 解引用運算子,可以把物件當作指標來使用。
new/delete 也可以進行過載,但不建議使用。
new會自動呼叫過載的new函式再建構函式。
delete會先呼叫析構再呼叫過載的delete函式。
只有極個別的運算子的過載對於物件來說是有意義(>>,<
常考的運算子過載:前++/--,後++/--
八、運算子過載的一些限制
1、不能過載的運算子
:: 作用域限定符
. 成員訪問運算
.* 成員指標解引用
?: 三目運算子
sizeof 位元組長度運算子
typeid 型別資訊操作符
2、運算子的過載改變不了運算子的優先順序
3、無法改變運算子的操作個數
4、無法發明新的運算子
5、過載運算子要注意運算子的一致性
不要改變運算子預設的運算規則
6、運算子的過載是為了方便使用、增強可讀,不應該成功賣弄的工具。
分數運算子過載(3)
all right reserved.檔名稱 test.cpp 作 者 韓雙志 完成日期 2016年5月27日 版本號 v1.0 問題描述 實現分數類中的運算子過載,在分數類中可以完成分數的加減乘除 運算後再化簡 比較 6種關係 的運算,定義分數的一目運算 和 分別代表分數取正和求反,將 按位取反運...
遞增運算子過載(3)
作用 通過過載遞增運算子,實現自己的整型資料 1 自定義整型資料實現 1 include 2 using namespace std 34 class myinteger512 13private 14 intm num 15 1617 因為cout在左邊,所以只能寫在全域性函式 18 過載左移運算...
類和物件 運算子過載 3 遞增運算子過載
作用 通過過載遞增運算子,實現自己的整型資料 include include using namespace std 自定義整型 class myinteger 過載前置 運算子 myinteger operator 返回引用為了一直對乙個資料進行遞增操作 過載後置 運算子 myinteger op...