C#中的運算符重載


C# 允許用戶自定義類型通過使用 operator 關鍵字定義靜態成員函數來重載運算符。

注意:

  • 必須用public修飾,必須是類的靜態的方法。
  • 重載相等運算符(==)時,還必須重載不相等運算(!=)。
  • < 和 > 運算符以及 <= 和 >= 運算符也必須成對重載。


可以重載的運算符:

  • 可以重載的一元運算符:+、-、!、~、++、--、true 和 false
  • 可以重載的二進制運算符:+, -, *, /, %, &, |, ^, <<, >>
  • 可以重載的比較運算符:==, !=, <, >, <=, >=

不能重載的運算符:

  • &&, || 條件邏輯運算符不能重載,但可使用能夠重載的 & 和 | 進行計算。
  • []不能重載數組索引運算符,但可定義索引器。
  • ()不能重載轉換運算符,但可定義新的轉換運算符(請參見 explicit 和 implicit)。
  • +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=賦值運算符不能重載,但 += 可使用 + 計算
  • =、.、?:、->、new、is、sizeof 和 typeof 不能重載這些運算符。

注意:

  • 若要在自定義類中重載運算符,您需要在該類中創建具正確簽名的方法。該方法必須命名為“operator X”,其中 X 是正在重載的運算符的名稱或符號。
  • 一元運算符具有一個參數,二元運算符具有兩個參數。
  • 在每種情況下,參數的類型必須與聲明運算符的類或結構的類型相同。

 下面是個人寫的一小段練習代碼:

 1 /* 設計一個復數類(Complex),
 2  * 包含兩個字段(實部x和虛部y),
 3  * 對運算符進行重載,實現兩個
 4  * 復數的加法和減法運算、
 5  * 以及判斷兩個復數是否一致
 6  */
 7 
 8 using System;
 9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 
13 namespace homeWork4
14 {
15     class Program
16     {
17         static void Main(string[] args)
18         {
19             Complex com1, com2, com3;
20             com1 = new Complex(1, 4);
21             com2 = new Complex(2, 6);
22             com3 = new Complex();
23             com3 = com1 + com2;
24             Console.WriteLine(com1 + " + " + com2 + " = " + com3);
25             com3 = com1 - com2;
26             Console.WriteLine(com1 + " - " + com2 + " = " + com3);
27             if (com1 == com2)
28                 Console.WriteLine("com1和com2一致");
29             else
30                 Console.WriteLine("com1和com2不一致");
31             Console.ReadKey();
32         }
33     }
34 
35     class Complex
36     {
37         public double x, y;
38         public Complex()
39         { x = y = 0; }
40         public Complex(double x, double y)
41         {
42             this.x = x;
43             this.y = y;
44         }
45         public static Complex operator +(Complex comp1, Complex comp2)
46         {
47             Complex comp = new Complex();
48             comp.x = comp1.x + comp2.x;
49             comp.y = comp1.y + comp2.y;
50             return comp;
51         }
52         public static Complex operator -(Complex comp1, Complex comp2)
53         {
54             Complex comp = new Complex();
55             comp.x = comp1.x - comp2.x;
56             comp.y = comp1.y - comp2.y;
57             return comp;
58         }
59         public override string ToString()
60         {
61             return "(" + x + "," + y + ")";
62         }
63         public static bool operator ==(Complex c1, Complex c2)
64         {
65             //將c1對象轉為object再進行判斷  
66             //這里的object.Equals(c1, null)也可以寫成  
67             //c1 as object == null  
68             if (object.Equals(c1, null) || object.Equals(c2, null))
69             {
70                 return object.Equals(c1, c2);
71             }
72             return c1.x == c2.x && c1.y == c2.y;
73         }
74 
75         public static bool operator !=(Complex c1, Complex c2)
76         {
77             if (object.Equals(c1, null) || object.Equals(c2, null))
78             {
79                 return !object.Equals(c1, c2);
80             }
81             return c1.x != c2.x || c1.y != c2.y;
82         }
83     };
84 }

 

作者:耑新新,發布於  博客園

轉載請注明出處,歡迎郵件交流:zhuanxinxin@aliyun.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM