C 運算子過載

2021-07-23 15:09:28 字數 3523 閱讀 5777

lilianchen

c#:運算子過載

運算子過載允許為運算指定使用者定義的運算子實現,其中乙個或兩個運算元是使用者定義的類或結構型別。使用者定義的運算子實現的優先順序總是高於預定義運算子實現:僅當沒有適用的使用者定義運算子實現時才會考慮預定義運算子實現。

運算子可過載性

+、-、!、~、++、--、true、false

可以過載這些一元運算子。

true和false運算子必須成對過載。

+、-、*、/、%、&、|、^、<<、>>

可以過載這些二元運算子。

==、!=、<、>、<=、>=

可以過載比較運算子。必須成對過載。

&&、||

不能過載條件邏輯運算子。

但可以使用能夠過載的&和|進行計算。

不能過載陣列索引運算子,但可以定義索引器。

()不能過載轉換運算子,但可以定義新的轉換運算子。

+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

不能顯式過載賦值運算子。

在重寫單個運算子如+、-、%時,它們會被隱式重寫。

=、.、?:、->、new、is、sizeof、typeof

不能過載這些運算子。

下面的例子中vector結構表示乙個三維向量:

複製**

1 using system;

2 4

19     }

20 21     struct vector

22    

31 32         public vector(vector rhs)

33         

34        

39 40         public override string tostring()

41        

44 45         public static vector operator +(vector lhs, vector rhs)

46        

53     }

54 }

複製**

輸出:對於二元運算子,第乙個引數是放在運算子左邊的值,一般命名為lhs;第二個引數是放在運算子右邊的值,一般命名為rhs

c#要求所有的運算子過載都宣告為public和static,這表示它們與它們的類或結構相關聯,而不是與例項相關聯。

新增過載乘法運算子:

1         public static vector operator *(double lhs, vector rhs)

2        

如果a和b宣告為vector型別,就可以編寫**:b=2*a; 編譯器會隱式的把整數2轉換為double型別,但是不能編譯**:b=a*2;

比較運算子的過載:

c#要求成對過載比較運算子,如果過載了==,也必須過載!=,否在會產生編譯錯誤。

比較運算子必須返回bool型別的值

注意:在過載==和!=時,還應該過載從system.object中繼承的equals()和gethashcode()方法,否則會產生乙個編譯警告,原因是equals方法應執行與==運算子相同的相等邏輯。

下面給vector結構過載==和!=運算子:

複製**

1         public static bool operator ==(vector lhs, vector rhs)

2        

7             else

8            

11         }

複製**

1         public static bool operator !=(vector lhs, vector rhs)

2        

過載true和false運算子:

複製**

1 using system;

2 4

17             }

18             console.readline();

19         }

20     }

21 22     public struct prime

23    

29 30         public static bool operator true(prime p)

31        

34 35         public static bool operator false(prime p)

36        

39 40         public static bool isprime(uint value)

41        

48             }

49             return true;

50         }

51 52         public override string tostring()

53        

56     }

57 }

複製**

輸出:複製**

1 using system;

2 4

15             else

16            

19             console.readline();

20         }

21     }

22 23     public struct dbbool

24    

35 36         public static bool operator true(dbbool x)

37        

40 41         public static bool operator false(dbbool x)

42        

45     }

46 }

複製**

輸出:分類: 程式語言c#

好文要頂 關注我 收藏該文    

lilianchen

關注 - 3

粉絲 - 115

+加關注

8 0#1樓 2013-03-16 08:28 山石曉月  

昨天我也寫了乙個,沒有==和!=...學習了。

支援(0)反對(0)

#2樓 2013-03-16 08:29 bit祝威  

求教一下,true是怎麼過載的?

支援(1)反對(0)

#3樓[樓主] 2013-03-18 11:57 lilianchen  

@ bit祝威

新新增了兩個關於過載運算子true, false的例子。希望對你有用

支援(0)反對(0)

#4樓 2013-03-18 13:47 bit祝威  

@ lilianchen

o(∩_∩)o謝謝!

支援(0)反對(0)

#5樓 2014-10-02 01:33 青樓滿座  

c#是怎麼解決++/--字首過載和字尾過載標識區分的問題呢?可否舉個例子

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...