C#操作符重载学习的一点总结

ericwuhk 2009-08-18

C#操作符重载问题的提出

在面向对象的程序设计中,自己定义一个类,就等于创建了一个新类型。类的实例和变量一样,可以作为参数传递,也可以作为返回类型。

C#操作符重载问题比如对于两个整型变量,使用算术操作符可以简便地进行算术运算:

class A  


{  



 public int x;  




 public int y;  




 public int Plus{  




    return x+y;  



  }  


} 

C#操作符重载问题再比如,我们希望将属于不同类的两个实例的数据内容相加:

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#中,所有数据要么属于某个类,要么属于某个类的实例,充分体现了面向对象的思想。因此,为了表达上的方便,人们希望可以重新给已定义的操作符赋予新的含义,在特定的类的实例上进行新的解释。这就需要通过操作符重载来解决。

使用成员方法重载操作符

C#操作符重载总是在类中进行声明,并且通过调用类的成员方法来实现。

操作符重载声明的格式为:

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

C#操作符重载可以实现的有:

+ - ! ~ ++ -- true false 


 


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

但也有一些操作符是不允许进行重载的,如:

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

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

顾名思义,一元操作符重载时操作符只作用于一个对象,此时参数表为空,当前对象作为操作符的单操作数。

下面我们举一个角色游戏中经常遇到的例子。扮演的角色具有内力、体力、经验值、剩余体力、剩余内力五个属性,每当经验值达到一定程序时,角色便会升级,体力、内力上升,剩余体力和内力补满。“升级”我们使用重载操作符“++”来实现。

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#操作符重载之二元操作符重载

大多数情况下我们使用二元操作符重载。这时参数表中有一个参数,当前对象作为该操作符的左操作数,参数作为操作符的右操作数。

下面我们给出二元操作符重载的一个简单例子,即笛卡儿坐标相加。

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);  



  }  


 


} 

相关推荐