運算符重載和自定義類型變換_第1頁
運算符重載和自定義類型變換_第2頁
運算符重載和自定義類型變換_第3頁
運算符重載和自定義類型變換_第4頁
運算符重載和自定義類型變換_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

運算符重載和自定義類型變換第一頁,共二十九頁,2022年,8月28日方法重載概述面向?qū)ο蟪绦蛟O(shè)計的一個重要特征,是一種臨時多態(tài)性重載決策是一種編譯時機制,用于在給定了參數(shù)列表和一組候選函數(shù)成員的情況下,由編譯器選擇一個最佳函數(shù)成員來實施調(diào)用。使得多個具有相同功能但參數(shù)不同的方法共享同一個方法名,降低程序員的工作強度,提高程序的可讀性例:doubleAdd(double,double);intAdd(int,int);第二頁,共二十九頁,2022年,8月28日方法重載重載方法有兩種方式指定不同個數(shù)的參數(shù)指定不同類型的參數(shù)重載的“兩必須一可以”方法名必須相同參數(shù)列表必須不同返回值可以不同第三頁,共二十九頁,2022年,8月28日重載方法的調(diào)用——簽名匹配對方法調(diào)用和方法聲明中的參數(shù)列表進行匹配,由編譯器來完成簽名匹配算法:如果能找到,使用精確匹配嘗試標(biāo)準(zhǔn)類型提升嘗試用戶自定義轉(zhuǎn)換第四頁,共二十九頁,2022年,8月28日運算符重載運算符重載允許為運算指定用戶定義的運算符實現(xiàn),其中一個或兩個操作數(shù)是用戶定義的類或結(jié)構(gòu)類型所有一元和二元運算符都具有可自動用于任何表達式的預(yù)定義實現(xiàn),可通過在類或結(jié)構(gòu)中設(shè)置operator

聲明來引入用戶定義的實現(xiàn),其優(yōu)先級總是高于預(yù)定義運算符實現(xiàn)重載運算符便于程序員編寫同時含有ADT和原生基本類型的中綴表達式,使程序更短,結(jié)構(gòu)更清晰第五頁,共二十九頁,2022年,8月28日復(fù)數(shù)類的四則運算定義一個復(fù)數(shù)類Complex,將其多個實例進行四則運算,如何編程實現(xiàn)?staticvoidMain(){Complexc1=newComplex(1,2);Complexc2=newComplex(3.5,-2);Complexc3=newComplex(-4,23);//result=c1+c2-c3如何得到?Complexresult=c1.Add(c2).Sub(c3);//將Add、Sub改成靜態(tài)方法會不會更好些?Complexresult2=Complex.Sub(Complex.Add(c1,c2),c3);Console.WriteLine(result2.Print());Console.Read();}第六頁,共二十九頁,2022年,8月28日在實現(xiàn)了需要的功能后,有沒有一種讓用戶用更習(xí)慣、可讀性、可編程性更好的方法來進行類似的運算呢?解決方案:運算符重載!第七頁,共二十九頁,2022年,8月28日可重載的運算符一元運算符

+-!~++--truefalse二元運算符

+-*/%&|^<<>>==!=><>=<=第八頁,共二十九頁,2022年,8月28日

publicclassComplex{ publicintreal; publicintimaginary; publicComplex(){ } publicComplex(intreal,intimaginary){ this.real=real; this.imaginary=imaginary; } publicstaticComplexoperator+(Complexc1,Complexc2) { returnnewComplex(c1.real+c2.real,c1.imaginary+c2.imaginary); }

publicstaticComplexoperator-(Complexc1,Complexc2) { returnnewComplex(c1.real-c2.real,c1.imaginary-c2.imaginary); } publicoverridestringToString(){ return(String.Format("{0}+{1}i",real,imaginary)); }}二元運算符重載示例注意函數(shù)原形!第九頁,共二十九頁,2022年,8月28日

publicstaticvoidMain(){Complexnum1=newComplex(3,4);Complexnum2=newComplex(3,4);Complexnum3=newComplex(-3,4);Complexsum=num1.Add(num2);Complexresult=num1+num2-num3;Console.WriteLine("Firstcomplexnumber:{0}",num1);Console.WriteLine("Secondcomplexnumber:{0}",num2);Console.WriteLine("Thesumofthetwonumbers:{0}",sum);Console.WriteLine("Theresult:{0}",result);Console.WriteLine(num1==num2);Console.Read();}自動調(diào)用num1的ToString()第十頁,共二十九頁,2022年,8月28日

publicstaticbooloperator==(Complexc1,Complexc2){if(c1.real==c2.real&&c1.imaginary==c2.imaginary)returntrue;elsereturnfalse;}publicstaticbooloperator!=(Complexc1,Complexc2){if(c1.real==c2.real&&c1.imaginary==c2.imaginary)returnfalse;elsereturntrue;}對==重載一定要對!=也進行重載,否則編譯器報錯第十一頁,共二十九頁,2022年,8月28日重寫Equals和GetHashCode方法警告1:“ConsoleApplication3.Complex”定義運算符==或運算符!=,但不重寫Object.Equals(objecto)和GetHashCode方法對于引用類型來說,Object.Equals方法比較的是對象的相等性。當(dāng)引用指向同一個對象的時候,它們是相等的,具有相同狀態(tài)但指向不同對象的引用是不相等的對于值類型來說,Equals已經(jīng)重寫過以進行值的比較第十二頁,共二十九頁,2022年,8月28日GetHashCode重載Equals必須重載GetHashCode這是一條編譯器的rule。如果你重載了Equals不重載GetHashCode,編譯器會發(fā)出警報GetHashCode需要返回一個Int32值,這個值得規(guī)律很簡單:如果兩個對象相同,則對象返回的HashCode必須相同。如果兩個對象返回的HashCode不相同,則這兩個對象必定不相同。兩個對象不相同,不能保證hashCode不同?這樣就使得Equals的效率提高很多。因為GetHashCode通常成本比Equals小得多。第十三頁,共二十九頁,2022年,8月28日

publicstaticbooloperator==(Complexc1,Complexc2){if(c1.real==c2.real&&c1.imaginary==c2.imaginary)returntrue;elsereturnfalse;}publicstaticbooloperator!=(Complexc1,Complexc2){if(c1.real==c2.real&&c1.imaginary==c2.imaginary)returnfalse;elsereturntrue;}publicoverrideboolEquals(objectobj){Complextemp=objasComplex;if(this==temp)returntrue;returnfalse;}publicoverrideintGetHashCode()//返回當(dāng)前對象的哈希代碼,不唯一!{returnthis.ToString().GetHashCode();}第十四頁,共二十九頁,2022年,8月28日整理一下,這樣更好

publicoverrideboolEquals(objectobj){Complextemp=objasComplex;if(temp.real==this.real&&temp.imaginary==this.imaginary)returntrue;returnfalse;}publicstaticbooloperator==(Complexc1,Complexc2){returnc1.Equals(c2);}publicstaticbooloperator!=(Complexc1,Complexc2){return!c1.Equals(c2);}publicoverrideintGetHashCode(){returnthis.ToString().GetHashCode();}第十五頁,共二十九頁,2022年,8月28日思考如何實現(xiàn)復(fù)數(shù)的其他運算?加/減乘/除取反顯示第十六頁,共二十九頁,2022年,8月28日自定義類型轉(zhuǎn)換現(xiàn)在,如果要實現(xiàn)int+Complex怎么辦呢?還有,complex+intComplex+doubledouble+complexfloat+ComplexComplex+float。。。為每種運算定義重載太麻煩了,有更好的辦法——自定義類型轉(zhuǎn)換第十七頁,共二十九頁,2022年,8月28日用戶自定義變換在不希望進行隱式類型變換或者表達式不合法時,有必要對表達式進行用戶自定義的類型變換。C#支持將用戶自定義的ADT和內(nèi)建的數(shù)據(jù)類型進行集成C#使用關(guān)鍵字implicit和explicit來修改單參數(shù)的靜態(tài)方法第十八頁,共二十九頁,2022年,8月28日用戶自定義的隱式變換Implicit關(guān)鍵字

用于聲明用戶定義的隱式類型轉(zhuǎn)換運算符,可通過消除不必要的類型轉(zhuǎn)換來提高源代碼的可讀

classMyType{publicstaticimplicitoperatorint(MyTypem){//codetoconvertfromMyTypetoint}}MyTypex;inti=x;//implicitlycallMyType'sMyType-to-intconversionoperator第十九頁,共二十九頁,2022年,8月28日用戶自定義的顯式變換explicit關(guān)鍵字

用于聲明用戶定義的顯式類型轉(zhuǎn)換運算符classMyType{publicstaticexplicitoperatorMyType(inti){//codetoconvertfrominttoMyType}}inti;MyTypex=(MyType)i;//int-to-MyTyperequirescast第二十頁,共二十九頁,2022年,8月28日為Complex類添加自定義類型轉(zhuǎn)換Complexnum1=newComplex(2,3);Complexnum2=newComplex(3,4);Complexnum3=4.5;Complexsum=num1+3+num2;Console.WriteLine("Thesumofthe3numbers:{0}",sum);

///<summary>///從實數(shù)到復(fù)數(shù)的自定義隱式轉(zhuǎn)換///</summary>///<paramname="r">復(fù)數(shù)的實部</param>///<returns></returns>publicstaticimplicitoperatorComplex(doubler){ returnnewComplex(r,0);}兩次隱式轉(zhuǎn)換:1)int-〉double2)double-〉Compleximplicit改成explicit將會如何?第二十一頁,共二十九頁,2022年,8月28日顯式自定義類型轉(zhuǎn)換publicstaticexplicitoperatorComplex(doubler){ returnnewComplex(r,0);}publicstaticvoidMain(){ Complexnum1=newComplex(2,3); Complexnum2=newComplex(3,4); Complexnum3=(Complex)4.5; Complexsum=num1+(Complex)3+num2; Console.WriteLine("Thesumofthe3numbers:{0}",sum);}更多運算符重載的例子。。。第二十二頁,共二十九頁,2022年,8月28日 publicclassDoubOp { publicDoubOp(inti,intj){ x=i; y=j; } publicstaticDoubOpoperator++(DoubOpa){ a.x++; a.y++; returna; } publicstaticDoubOpoperator--(DoubOpa){ a.x--; a.y--; returna; } publicvoidPrint(){ Console.WriteLine(this.x+""+this.y); } intx,y; }

classTest{ publicstaticvoidMain(){ DoubOpa=newDoubOp(10,29); a.Print(); a++; a.Print(); a--; a.Print(); }}一元運算符重載示例第二十三頁,共二十九頁,2022年,8月28日二元運算符重載示例publicclassAngle{publicintdeg,min,sec;publicAngle(intdegree,intminute,intsecond){this.deg=degree;this.min=minute;this.sec=second;}publicstaticAngleoperator+(Anglea,Angleb){Anglet=newAngle(0,0,0);t.sec=a.sec+b.sec;if(t.sec>=60){t.sec-=60;t.min+=1;}t.min+=a.min+b.min;if(t.min>=60){t.min-=60;t.deg+=1;}t.deg+=a.deg+b.deg;returnt;}publicoverridestringToString(){ return(deg+"°"+min+"‘"+sec+“’’"); }} 第二十四頁,共二十九頁,2022年,8月28日classTest { publicstaticvoidMain() { Anglem=newAngle(10,20,30); Anglen=newAngle(40,50,50); Console.WriteLine(m+n); Console.Read(); } }第二十五頁,共二十九頁,2022年,8月28日重載關(guān)系運算符publicstaticbooloperator>(Anglea,Angleb){ if(a.deg>b.deg)re

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論