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