国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

一起學習《C#高級編程》3--運算符重載

2019-11-17 02:41:10
字體:
來源:轉載
供稿:網友

一起學習《C#高級編程》3--運算符重載

  運算符的重載。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),那用戶定義的類型的轉換又是怎樣的呢?

下期敘述,用戶定義類型的強制轉換


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 旬阳县| 黔江区| 通州市| 侯马市| 始兴县| 西华县| 唐河县| 岳西县| 长阳| 龙里县| 海宁市| 东兴市| 清流县| 连州市| 山阴县| 吉木乃县| 普安县| 亚东县| 雷山县| 嵩明县| 松滋市| 镇赉县| 内丘县| 合江县| 来安县| 西华县| 石棉县| 五峰| 屏东市| 恩平市| 阜城县| 从江县| 图木舒克市| 巢湖市| 清远市| 莱阳市| 沁水县| 铜梁县| 潜山县| 汕尾市| 沈阳市|