C#操作符重載


C#操作符重載是什么?

是指允許用戶使用用戶定義的類型編寫表達式的能力。

例如,通常需要編寫類似於以下內容的代碼,以將兩個數字相加。很明顯,sum 是兩個數字之和。

int i = 5; int sum = i + j;

如果可以使用代表復數的用戶定義的類型來編寫相同類型的表達式,那當然是最好不過了:

Complex i = 5;Complex sum = i + j;

運算符重載允許為用戶定義的類型重載(即指定明確的含義)諸如“+”這樣的運算符。如果不進行重載,則用戶需要編寫以下代碼:

Complex i = new Complex(5);Complex sum = Complex.Add(i, j);

此代碼可以很好地運行,但 Complex 類型並不能象語言中的預定義類型那樣發揮作用。

在我看來是操作符重載是讓struct、class、Interface等能夠進行運算。

如時實現C#操作符重載。

先寫關鍵詞public和static,后跟返回類型,后跟operator關鍵詞,后跟要聲明的操作符符號,最后在對一對圓括號中添加恰當的參數。

如下例中的struct Hour中的public static Hour operator+ (Hour lhs,Hour rhs){...}

C#操作符重載方法:

1、編寫操作符重載方法。

2、實例化后,進行操作符運算

下邊用C#操作符重載代碼進行說明:

1. class Program  

2. {  

3. static void Main(string[] args)  

4. {  

5. Hour hrValue1 = new Hour(10);  

6. Hour hrValue2 = new Hour(20);  

7.  

8. //2、得到兩個Hour相加結果  

9. Hour hrSum = hrValue1 + hrValue2;  

10.  

11. //得到Hour+Int的結果  

12. Hour hrSumInt = hrValue1 + 10;  

13.  

14. //得到Int+Hour的結果  

15. Hour hrIntSum = 11 + hrValue2;  

16. Console.WriteLine("hrValue1 +  hrValue2 = {0}", hrSum.iValue);  

17. Console.WriteLine("hrValue1 +  10  = {0}", hrSumInt.iValue);  

18. Console.WriteLine("11 +  hrValue2  = {0}", hrIntSum.iValue);  

19. Console.ReadKey();  

20. }  

21. struct Hour  

22. {  

23. private int value;  

24. //此構造函數根據int值創建Hour類 ,C#操作符重載 

25. public Hour(int iValue)  

26. {  

27. this.value = iValue;  

28. }  

29. //定義一個屬性,便於取用value值  

30. public int iValue  

31. {  

32. get 

33. {  

34. return value;  

35. }  

36. } //C#操作符重載

37. //1、聲明一個二元操作符,將兩個Hour類加到一起   

38. public static Hour operator+ (Hour lhs,Hour rhs)  

39. {  

40. return new Hour(lhs.value + rhs.value);  

41. }  

42.  

43. /*  

44. 操作符是public的。所有操作符都必須是public的  

45.  

46. 操作符是static的。所有操作符都必須是static的,操作永遠不具有多態性,  

47.  

48. 面且不能使用virtualabstractoverride或者sealed修飾符。  

49.  

50. 二元操作符(比如+)有兩個顯式參數;一元操作符有一個顯式的參數  

51.  

52. 我們有了public Hour(int iValue)構造函數,就可以將一個intHour相加,只是首先要將int轉換成為Hour  

53.  

54. hour a= ;  

55.  

56. int b= ;  

57.  

58. Hour sum=a+new Hour(b);  

59.  

60. 雖然上述代碼完全有效,但相較於讓一個Hour和一個int直接相加它即不清晰也不准確。  

61.  

62. 為了使Hour可以+ int,必須聲明一個二元操作符+,它的第一個參數是Hour,第二個參數是一個int。  

63.  C#操作符重載

64.  */ 

65. public static Hour operator+ (Hour lhs,int rhs)  

66. {  

67. return lhs + new Hour(rhs);  

68. }  

69. //使一個int 可以+hour。  

70. public static Hour operator +(int lhs, Hour rhs)  

71. {  

72. return new Hour(lhs)+rhs;  

73. }  

74. }  

75. 

 

C#操作符重載示例2

1. struct Hour  

2. {  

3. public int iValue;  

4. //構造函數  

5. public Hour(int initialValue)  

6. {  

7. this.iValue = initialValue;  

8. }  

9. //1、定義操作符重載(一元操作符)  

10. public static Hour operator ++ (Hour huValue)  

11. {  

12. huValue.iValue++;  

13. return huValue;  

14. }  //C#操作符重載

15.  

16. //==操作符是二元操作符,必須帶有兩個參數  

17. public static bool operator==(Hour lhs,Hour rhs)  

18. {  

19. return lhs.iValue == rhs.iValue;  

20. }  

21. public static bool operator!=(Hour lhs,Hour rhs)  

22. {  

23. return lhs.iValue != rhs.iValue;  

24. }  

25. }  

26.  

27. //++操作符有前綴和后綴的形式,C#能智能地為前綴后后綴使用同一個操作符。  

28.  

29. static void Main(string[] args)  

30. {  

31. //2、實例化類  ,C#操作符重載

32.  

33. Hour hu = new Hour(10);  

34. //3、  

35. //操作符重載  

36.  

37. hu++;  

38. //輸出重載后的結果  

39.  

40. Console.WriteLine("Hu++ = {0}", hu.iValue);  

41. //C#操作符重載  

42.  

43. ++hu;  

44. //輸出重載后的結果  

45.  

46. Console.WriteLine("Hu++ = {0}", hu.iValue);  

47.  

48. Console.ReadKey();  

49. }  

C#操作符重載問題的提出

在面向對象的程序設計中,自己定義一個類,就等於創建了一個新類型。類的實例和變量一樣,可以作為參數傳遞,也可以作為返回類型。

C#操作符重載問題比如對於兩個整型變量,使用算術操作符可以簡便地進行算術運算:

1. class A  

2. {  

3.  public int x;  

4.  public int y;  

5.  public int Plus{  

6.     return x+y;  

7.   }  

8. 

C#操作符重載問題再比如,我們希望將屬於不同類的兩個實例的數據內容相加:

9. class B  

10. {  

11.   public int x;  

12. }  

13. class Test  

14. {  

15.  public int z;  

16.  public static void Main{  

17.     A a=new A();  

18.     B b=new B();  

19.     z=a.x+b.x;  

20.  }  

21. 

使用a.x+b.x這種寫法不夠簡潔,也不夠直觀。更為嚴重的問題是,如果類的成員中聲明時使用的不是publixc修飾符的話,這種訪問就是非法的。

我們知道,在C#中,所有數據要么屬於某個類,要么屬於某個類的實例,充分體現了面向對象的思想。因此,為了表達上的方便,人們希望可以重新給已定義的操作符賦予新的含義,在特定的類的實例上進行新的解釋。這就需要通過操作符重載來解決。

使用成員方法重載操作符

C#操作符重載總是在類中進行聲明,並且通過調用類的成員方法來實現。

操作符重載聲明的格式為:

22. type operator operator-name(formal-param-list) 

C#操作符重載可以實現的有:

23. + - ! ~ ++ -- true false 

24.  

25. * / % & | ^ << >> == != > < >= <= 

但也有一些操作符是不允許進行重載的,如:

26. =,&&,||,?:,new,typeof,sizeof,is 

C#操作符重載之一元操作符重載

顧名思義,一元操作符重載時操作符只作用於一個對象,此時參數表為空,當前對象作為操作符的單操作數。

下面我們舉一個角色游戲中經常遇到的例子。扮演的角色具有內力、體力、經驗值、剩余體力、剩余內力五個屬性,每當經驗值達到一定程序時,角色便會升級,體力、內力上升,剩余體力和內力補滿。“升級”我們使用重載操作符“++”來實現。

C#操作符重載程序:

27. using System;  

28. class Player  

29. {  

30.  public int neili;  

31.  public int tili;  

32.  public int jingyan;  

33.  public int neili_r;  

34.  public int tili_r;  

35.  public Player()  

36.  {  

37.    neili=10;  

38.    tili=50;  

39.    jingyan=0;  

40.    neli_r=50;  

41.    tili_r=50;  

42.  }  

43.  public static Player operator ++(Player p){  

44.    p.neili=p.neili+50;  

45.    p.tili=p.tili+100;  

46.    p.neili_r=p.neili;  

47.    p.tili_r=p.tili;  

48.    return p;  

49.  }  

50.  public void Show()  

51.  {  

52.   Console.WriteLine("Tili:{0}",tili);  

53.   Console.WriteLine("Neili:{0}",neili);  

54.   Console.WriteLine("Tili_full:{0}",tili_r);  

55.   Console.WriteLine("Neili_full:{0}",neili_r);  

56.  }  

57. }  

58. class Test  

59. {  

60.  public static void Main(){  

61.     Player man=new Player();  

62.     man.Show();  

63.     man++;  

64.     Console.WriteLine("Now upgrading...:");  

65.     man.Show();  

66.  }  

67. 

C#操作符重載之二元操作符重載

大多數情況下我們使用二元操作符重載。這時參數表中有一個參數,當前對象作為該操作符的左操作數,參數作為操作符的右操作數。

下面我們給出二元操作符重載的一個簡單例子,即笛卡兒坐標相加。

C#操作符重載程序:

68. using System;  

69. class DKR  

70. {  

71.   public int x,y,z;  

72.   public DKR(int vx,int vy,int vz){  

73.      x=vx;  

74.      y=vy;  

75.      z=vz;  

76.   }  

77.   public static DKR operator +(DKR d1,DKR d2)  

78.   {  

79.   DKR dkr=new DKR(0,0,0);  

80.   dkr.x=d1.x+d2.x;  

81.   dkr.y=d1.y+d2.y;  

82.   dkr.z=d1.z+d2.z;  

83.   return dkr;  

84.   }  

85. }  //C#操作符重載

86. class Test  

87. {  

88.   publixc statixc void Main(){  

89.     DKR d1=new DKR(3,2,1);  

90.     DKR d2=new DKR(0,6,5);  

91.     DKR d3=d1+d2;  

92.     Console.WriteLine("The 3d 

93. location of d3 is:{0},{1},{2}",d3.x,d3.y,d3,z);  

94.   }  

95.  

96. 

 

 


免責聲明!

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



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