運算符的重載。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),那用戶定義的類型的轉換又是怎樣的呢?
下期敘述,用戶定義類型的強制轉換
新聞熱點
疑難解答