還是看代碼,比較直接,裡面有詳細的描述,應該能看懂。
/*
* 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)
}
}