C#操作符重載學習的一點總結(jié)
C#操作符重載問題的提出
在面向?qū)ο蟮某绦蛟O計中,自己定義一個類,就等于創(chuàng)建了一個新類型。類的實例和變量一樣,可以作為參數(shù)傳遞,也可以作為返回類型。
C#操作符重載問題比如對于兩個整型變量,使用算術(shù)操作符可以簡便地進行算術(shù)運算:
- class A
- {
- public int x;
- public int y;
- public int Plus{
- return x+y;
- }
- }
C#操作符重載問題再比如,我們希望將屬于不同類的兩個實例的數(shù)據(jù)內(nèi)容相加:
- class B
- {
- public int x;
- }
- class Test
- {
- public int z;
- public static void Main{
- A a=new A();
- B b=new B();
- z=a.x+b.x;
- }
- }
使用a.x+b.x這種寫法不夠簡潔,也不夠直觀。更為嚴重的問題是,如果類的成員中聲明時使用的不是publixc修飾符的話,這種訪問就是非法的。
我們知道,在C#中,所有數(shù)據(jù)要么屬于某個類,要么屬于某個類的實例,充分體現(xiàn)了面向?qū)ο蟮乃枷?。因此,為了表達上的方便,人們希望可以重新給已定義的操作符賦予新的含義,在特定的類的實例上進行新的解釋。這就需要通過操作符重載來解決。
使用成員方法重載操作符
C#操作符重載總是在類中進行聲明,并且通過調(diào)用類的成員方法來實現(xiàn)。
操作符重載聲明的格式為:
- type operator operator-name(formal-param-list)
C#操作符重載可以實現(xiàn)的有:
- + - ! ~ ++ -- true false
- * / % & | ^ << >> == != > < >= <=
但也有一些操作符是不允許進行重載的,如:
- =,&&,||,?:,new,typeof,sizeof,is
C#操作符重載之一元操作符重載
顧名思義,一元操作符重載時操作符只作用于一個對象,此時參數(shù)表為空,當前對象作為操作符的單操作數(shù)。
下面我們舉一個角色游戲中經(jīng)常遇到的例子。扮演的角色具有內(nèi)力、體力、經(jīng)驗值、剩余體力、剩余內(nèi)力五個屬性,每當經(jīng)驗值達到一定程序時,角色便會升級,體力、內(nèi)力上升,剩余體力和內(nèi)力補滿?!吧墶蔽覀兪褂弥剌d操作符“++”來實現(xiàn)。
C#操作符重載程序:
- using System;
- class Player
- {
- public int neili;
- public int tili;
- public int jingyan;
- public int neili_r;
- public int tili_r;
- public Player()
- {
- neili=10;
- tili=50;
- jingyan=0;
- neli_r=50;
- tili_r=50;
- }
- public static Player operator ++(Player p){
- p.neili=p.neili+50;
- p.tili=p.tili+100;
- p.neili_r=p.neili;
- p.tili_r=p.tili;
- return p;
- }
- public void Show()
- {
- Console.WriteLine("Tili:{0}",tili);
- Console.WriteLine("Neili:{0}",neili);
- Console.WriteLine("Tili_full:{0}",tili_r);
- Console.WriteLine("Neili_full:{0}",neili_r);
- }
- }
- class Test
- {
- public static void Main(){
- Player man=new Player();
- man.Show();
- man++;
- Console.WriteLine("Now upgrading...:");
- man.Show();
- }
- }
C#操作符重載之二元操作符重載
大多數(shù)情況下我們使用二元操作符重載。這時參數(shù)表中有一個參數(shù),當前對象作為該操作符的左操作數(shù),參數(shù)作為操作符的右操作數(shù)。
下面我們給出二元操作符重載的一個簡單例子,即笛卡兒坐標相加。
C#操作符重載程序:
- using System;
- class DKR
- {
- public int x,y,z;
- public DKR(int vx,int vy,int vz){
- x=vx;
- y=vy;
- z=vz;
- }
- public static DKR operator +(DKR d1,DKR d2)
- {
- DKR dkr=new DKR(0,0,0);
- dkr.x=d1.x+d2.x;
- dkr.y=d1.y+d2.y;
- dkr.z=d1.z+d2.z;
- return dkr;
- }
- } //C#操作符重載
- class Test
- {
- publixc statixc void Main(){
- DKR d1=new DKR(3,2,1);
- DKR d2=new DKR(0,6,5);
- DKR d3=d1+d2;
- Console.WriteLine("The 3d
- location of d3 is:{0},{1},{2}",d3.x,d3.y,d3,z);
- }
- }
試著編譯、運行該程序,看結(jié)果是否與預期一致。
C#操作符重載的基本內(nèi)容就向你介紹到這里,希望對你了解和學習C#操作符重載有所幫助.
【編輯推薦】