C#运算符重载

本文开发一个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()与"=="运算符是相等的逻辑运算。

其它的运算符就自己玩去吧。

原文地址:https://www.cnblogs.com/xiaoyu5062/p/2580607.html