C#運(yùn)算符重載概念及應(yīng)用詳解
什么是C#運(yùn)算符重載?
所謂運(yùn)算符重載,就是對(duì)已有的運(yùn)算符重新進(jìn)行定義,賦予其另一種功能,以適應(yīng)不同的數(shù)據(jù)類(lèi)型。
自定義類(lèi)的賦值運(yùn)算符重載函數(shù)的作用與內(nèi)置賦值運(yùn)算符的作用類(lèi)似,但是要要注意的是,它與拷貝構(gòu)造函數(shù)與析構(gòu)函數(shù)一樣,要注意深拷貝淺拷貝的問(wèn)題,在沒(méi)有深拷貝淺拷貝的情況下,如果沒(méi)有指定默認(rèn)的賦值運(yùn)算符重載函數(shù),那么系統(tǒng)將會(huì)自動(dòng)提供一個(gè)賦值運(yùn)算符重載函數(shù)。
下面是Vector的定義—— 包含成員字段、構(gòu)造函數(shù)和一個(gè)ToString()重寫(xiě)方法,以便查看Vector的內(nèi)容,***是C#運(yùn)算符重載:
- namespace Wrox.ProCSharp.OOCSharp
- {
- struct Vector
- {
- public double x, y, z;
- public Vector(double x, double y, double z)
- {
- this.x = x;
- this.y = y;
- this.z = z;
- }
- public Vector(Vector rhs)
- {
- x = rhs.x;
- y = rhs.y;
- z = rhs.z;
- }
- public override string ToString()
- {
- return "( " + x + " , " + y + " , " + z + " )";
- }
這里提供了兩個(gè)構(gòu)造函數(shù),通過(guò)傳遞每個(gè)元素的值,或者提供另一個(gè)復(fù)制其值的Vector,來(lái)指定矢量的初始值。第二個(gè)構(gòu)造函數(shù)帶一個(gè)Vector參數(shù),通常稱(chēng)為復(fù)制構(gòu)造函數(shù),因?yàn)樗鼈冊(cè)试S通過(guò)復(fù)制另一個(gè)實(shí)例來(lái)初始化一個(gè)類(lèi)或結(jié)構(gòu)實(shí)例。注意,為了簡(jiǎn)單起見(jiàn),把字段設(shè)置為public。也可以把它們?cè)O(shè)置為private,編寫(xiě)相應(yīng)的屬性來(lái)訪問(wèn)它們,這樣做不會(huì)改變這個(gè)程序的功能,只是代碼會(huì)復(fù)雜一些。
下面是Vector結(jié)構(gòu)的有趣部分—— 為+運(yùn)算符提供支持的C#運(yùn)算符重載:
- public static Vector operator + (Vector lhs, Vector rhs)
- {
- Vector result = new Vector(lhs);
- result.x += rhs.x;
- result.y += rhs.y;
- result.z += rhs.z;
- return result;
- }
- }
- }
C#運(yùn)算符重載的聲明方式與方法的聲明方式相同,但operator關(guān)鍵字告訴編譯器,它實(shí)際上是一個(gè)運(yùn)算符重載,后面是相關(guān)運(yùn)算符的符號(hào),在本例中就是+。返回類(lèi)型是在使用這個(gè)運(yùn)算符時(shí)獲得的類(lèi)型。在本例中,把兩個(gè)矢量加起來(lái)會(huì)得到另一個(gè)矢量,所以返回類(lèi)型就是Vector。對(duì)于這個(gè)+運(yùn)算符重載,返回類(lèi)型與包含類(lèi)一樣,但這種情況并不是必需的。兩個(gè)參數(shù)就是要操作的對(duì)象。對(duì)于二元運(yùn)算符(帶兩個(gè)參數(shù)),如+和-運(yùn)算符,***個(gè)參數(shù)是放在運(yùn)算符左邊的值,第二個(gè)參數(shù)是放在運(yùn)算符右邊的值。
C#要求所有的C#運(yùn)算符重載都聲明為public和static,這表示它們與它們的類(lèi)或結(jié)構(gòu)相關(guān)聯(lián),而不是與實(shí)例相關(guān)聯(lián),所以運(yùn)算符重載的代碼體不能訪問(wèn)非靜態(tài)類(lèi)成員,也不能訪問(wèn)this標(biāo)識(shí)符;這是可以的,因?yàn)閰?shù)提供了運(yùn)算符執(zhí)行任務(wù)所需要知道的所有數(shù)據(jù)。
前面介紹了聲明運(yùn)算符+的語(yǔ)法,下面看看運(yùn)算符內(nèi)部的情況:
- {
- Vector result = new Vector(lhs);
- result.x += rhs.x;
- result.y += rhs.y;
- result.z += rhs.z;
- return result;
- }
這部分代碼與聲明方法的代碼是完全相同的,顯然,它返回一個(gè)矢量,其中包含前面定義的lhs和rhs的和,即把x、y和z分別相加。
下面需要編寫(xiě)一些簡(jiǎn)單的代碼,測(cè)試Vector結(jié)構(gòu):
- static void Main()
- {
- Vector vect1, vect2, vect3;
- vect1 = new Vector(3.0, 3.0, 1.0);
- vect2 = new Vector(2.0,­­­–4.0,–4.0);
- vect3 = vect1 + vect2;
- Console.WriteLine("vect1 = " + vect1.ToString());
- Console.WriteLine("vect2 = " + vect2.ToString());
- Console.WriteLine("vect3 = " + vect3.ToString());
- }
把這些代碼保存為Vectors.cs,編譯并運(yùn)行它,結(jié)果如下:
- Vectors
- vect1 = ( 3 , 3 , 1 )
- vect2 = ( 2 ,–4 ,–4 )
- vect3 = ( 5 ,–1 ,–3 )
C#運(yùn)算符重載不能用于Java。
C#運(yùn)算符重載的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你了解C#運(yùn)算符重載有所幫助。
【編輯推薦】