本文开发一个Vector结构来说明运算符重载,Vector结构表示一个三维矢量,别担心数学不好,这不是重点。三维矢量只是3个(double)数字的一个集合,说明物体和原点之间的距离,例如(2.0,3.0,5.0)就是表示在三维坐标上x=2.0,y=3.0,z=5.0,这个看不懂,那回家翻书瞧瞧就行。
注:本文将Vector作为结构开发,而不是类,这也不是问题,运算符重载用于结构和类时都一个样。
下面是Vector的定义——成员字段、构造函数和重写的ToString()方法,还有重点运算符重载。
1 struct Vector { 2 public double x, y, z; 3 4 public Vector (double x,double y,double z ) { 5 this.x = x; this.y = y; this.z = z; 6 } 7 8 public Vector ( Vector rhs) { 9 this.x = rhs.x; this.y = rhs.y; this.z = rhs.z; 10 } 11 12 //重写ToString方法方便显示Vector的内容 13 public override string ToString ( ) { 14 return "(" + x + "," + y + "," + z + ")"; 15 } 16 17 //运算符重载 18 //C#要求所有的运算符重载都声明为Public和static 19 public static Vector operator + (Vector lhs, Vector rhs ){ 20 return new Vector ( ) { x=lhs.x+rhs.x ,y =lhs.y+rhs.y ,z=lhs.z +rhs.z }; 21 } 22 }
下面编写一些简单代码来测试Vector结构:
static void Main ( string[ ] args ) { Vector vect1, vect2, vect3; vect1 = new Vector ( 4, 5, 6 ); vect2 = new Vector ( 1, 2, 3 ); vect3 = vect1 + vect2; Console.WriteLine ("vect1:"+ vect1.ToString ()); Console.WriteLine ( "vect2:" + vect2.ToString ( ) ); Console.WriteLine ( "vect3:" + vect3.ToString ( ) ); Console.ReadKey ( ); }
注:加法没啥问题,如乘法的重载参数为(Vector lhs, double rhs)时,测试Vect=2*Vect1时将会找不到重载方法导致编译错误(编译器不会自动帮我们交换参数)。
以上是最简单的运算符重载,当然还可以重载其它运算符,包括逻辑运算符(如==、>= ....),但是重载"=="和"!="的时候还必须重载System.Object中继承的Equals()和GetHashCode(),因为Equals()与"=="运算符是相等的逻辑运算。
其它的运算符就自己玩去吧。