3 運算子過載

2022-07-31 02:06:11 字數 3492 閱讀 3655

一、操作符函式

在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 2

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

point過載所有運算子

四、典型的雙目運算子過載

成員函式

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...