運算符的重載。C++的開發人員應該很熟悉這個概念,但這對Java 和 VB 開發人員確實全新的。
對於一些數值間的運算,如果通過方法來指定運算規則的話,不免會繁瑣,這時就可以利用運算符的重載。
例:
Matrix a,b,c; //定義矩陣對象
Marix d=c*(a+b);
如果用不支持運算符重載的語言的話,就必須定義方法,通過調用方法來進行計算:
Marix d=c.Muliply(a.Add(b));
結果很不直觀
運算符的重載,在數學或物理建模會經常用到(比如坐標,矢量,矩陣,函數運算等)。還有比如圖形,財務方面。。當然,如果你要用於計算日期,比如兩個DateTime相乘,沒人會攔你,雖然在概念上沒有任何意義,哈哈。
其實,之前我們在編寫代碼的時候都會使用過運算符的重載,雖然我們自己沒定義重載運算符,但C#默認有幫我們實現了。
int myInt=3; uint myUint=2; double myDouble=13.2; long myLong=myInt+myUint; double myDouble=myDouble+myInt; double myDouble2=myInt+myDouble;
"+"運算符,會接受兩個參數,然後根據參數查找最匹配的運算符的重載方法
上面的long myLong=myInt+myUint;和double myDouble2=myInt+myDouble;調用的是不同版本的重載。
在C#中,編譯器會自動匹配最適合的重載方法,就如 對於double和int型數據,“+”運算符沒有帶這種復合參數的重載,所以編譯器就認為,最匹配的“+”重載是兩個double類型相加,所得到數是double類型也就不奇怪 了
那麼對於自定義的類型會怎樣呢,這樣的話就得自己定義運算符的重載啦。
定義一個Vector結構,表示一個三維數學坐標 (x,y,z)
struct Vector { private double x, y, z; public Vector(double x,double y,double z) { this.x = x; this.y = y; this.z = z; } public Vector(Vector vec) { this.x = vec.x; this.y = vec.y; this.z = vec.z; } public override string ToString() { return "(" + x + "," + y + "," + z + ")"; } //+運算符重載 public static Vector operator + (Vector lhs,Vector rhs) { Vector result=new Vector(); result.x=lhs.x+rhs.x; result.y=lhs.y+rhs.y; result.z=lhs.z+rhs.z; return result;//返回兩個3維坐標相加後的值 } }
static void Main(string[] args)
{
//首先定義3維坐標對象
Vector vec1 = new Vector(1, 0, -2);
Vector vec2 = new Vector(2, -1, 5);
Vector vec3 = vec1 + vec2;
Console.WriteLine(vec1.ToString()); //輸出(1,0,-2)
Console.WriteLine(vec2.ToString()); //輸出(2,-1,5)
Console.WriteLine(vec3.ToString()); //輸出(3,-1,3)
Console.ReadLine();
}
當然還可以定義更多的重載運算,相加,相減,相乘。還可以標量與矢量相乘,比如 2*(1,2,3)
public static Vector operator *(double lhs,Vector rhs)
{
return new Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z);
}
對於2.0*(1,2,3)和2*(1,2,3)都會調用這個重載。 但是,對於(1,2,3)*2,得另外重載一個方法
public static Vector operator *(Vector lhs,double rhs)
{
return rhs * lhs;
}
這裡,沒必要像上一個方法那樣重新運算過程,直接重用上面的代碼。。這個闡述了代碼的簡潔思想,也提高了代碼的可維護性。
相信,接下來寫矢量相乘的話,也不是難事了,就不多寫了。
當然,還有就是比較符的重載,包括下面3對:
==和!=
>和<
>=和<=
其實,重載方法的操作是一樣的,把上例重點"+"運算符改為 比較運算符。
public static bool operator ==(Vector lhs,Vector rhs)
{
return ???
}
竟然寫了一個小時,0:11了,趕緊睡覺!
下期內容: 常見的系統預制數值類型的轉換(比如 float轉換成double),那用戶定義的類型的轉換又是怎樣的呢?
下期敘述, 用戶定義類型的強制轉換