c#实现算术运算符的重载(关键字operator)

还是看代码,比较直接,里面有详细的描述,应该能看懂。
/*
 * Created by SharpDevelop.
 * User: noo
 * Date: 2009-9-1
 * Time: 11:45
 * 
 * 运算符,如+,-,*,/,==,!=,>,<等,只是对系统预定义的数据类型,如int,float,double,string等,进行的一些操作
 * 比如说:系统可以识别int+int,string+string,float>float等,这是因为系统在这些数据类型中对这些运算符作了重载
 * 也就是写了实现的代码,不然代码是不能通过编译的。但是如果我们自己定义了一个类(如向量类Vector),能否实现诸如+,-,>,<的运算符呢?
 * 这是不可能的所以这个时候就需要我们告诉计算机"+"在这个类(Vector)中代表的意思是什么,计算机应该怎样操作Vector+Vector
 * 这就涉及到运算符的重载问题
 * 
 * 自定义类(向量类)的算术运算符的重载
 
*/
using System ;
class Vector//向量类
{
    
private double X,Y,Z;
    
public Vector(double x,double y,double z)//向量的x,y,z坐标
    {
        
this.X =x;
        
this.Y =y;
        
this.Z =z;
    }
    
public override string ToString()//重写ToSting方法
    {
        
string strResult="("+this.X  +","+this.Y  +","+this.Z +")";
        
return strResult;
    }
    
public static Vector operator +(Vector v1,Vector v2)//对"+"运算符的重载,修饰符一定是public 和static
    {
        
return new Vector (v1.X +v2.X ,v1.Y +v2.Y ,v1.Z +v2.Z );
    }
    
public static Vector operator -(Vector v1,Vector v2)//向量相减
    {
        
return new Vector (v1.X -v2.X ,v1.Y -v2.Y ,v1.Z -v2.Z );
    }
    
public static double operator *(Vector v1,Vector v2)//内积
    {
        
return v1.X *v2.X +v1.Y *v2.Y +v1.Z *v2.Z ;
    }
    
public static Vector operator *(Vector v,double d)//向量与数字相乘
    {
        
return new Vector (v.X  *d,v.Y *d,v.Z *d);
    }
    
public static Vector operator *(double d,Vector v)
    {
        
return v*d;//简单的写法,也可以写下面一句
//        return new Vector (v.X  *d,v.Y *d,v.Z *d);
    }
    
public static Vector operator /(Vector v,double d)//向量与数字相除
    {
        
return new Vector (v.X /d,v.Y/d,v.Z /d);
    }
}
class test
{
    
static void Main()
    {
        Vector vec1
=new Vector (4,5,6);
        Vector vec2
=new Vector (-8,7,0);
        Console.WriteLine (vec1
+vec2);//调用Vector类重载的ToString方法,输出(-4,12,6)
        Console.WriteLine (vec1-vec2);//调用Vector类重载的ToString方法,输出(12,-2,6)
        Console.WriteLine (vec1*vec2);//调用double结构重载的ToString方法,输出3
        Console.WriteLine (vec1*4);//调用Vector类重载的ToString方法,输出(16,20,24)
        Console.WriteLine (4*vec1);//调用Vector类重载的ToString方法,输出(16,20,24)
        Console.WriteLine (vec1/5);//调用Vector类重载的ToString方法,输出(0.8,1,1.2)
        vec1+=vec2;//注意这里引用的"+="不需要在Vector类中重载,因为编译器默认会执行vec1=vec1+vec2
        Console.WriteLine (vec1);//输出(-4,12,6)
    }
}
posted @ 2009-09-01 14:14  爱生活,爱GIS  阅读(1814)  评论(0编辑  收藏  举报