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)
}
}
* 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)
}
}