歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > PPT文檔下載  

c課件運算符重載和類重載.ppt

  • 資源ID:11549015       資源大小:284.55KB        全文頁數(shù):51頁
  • 資源格式: PPT        下載積分:14.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要14.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認(rèn)打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。

c課件運算符重載和類重載.ppt

第12章運算符重載和類型重載,主要內(nèi)容:12.1運算符重載規(guī)則12.2類型重載,在C+中有這樣的情況,同一個類型或運算符在不同的類中代表不同的意思或者實施不同的運算,這就是面向?qū)ο蟮娜筇攸c之一的多態(tài)。函數(shù)重載是C+語言中多態(tài)的一種表現(xiàn)形式,運算符重載和類型重載是多態(tài)的另外兩種表現(xiàn)形式。,運算符重載是對已有的運算符賦予多重含義。C+中預(yù)定義的運算符的操作對象只能是基本數(shù)據(jù)類型,對于很多用戶自定義類型,也需要有類似的運算操作,這就提出了對運算符進行重新定義,賦予已有符號以新功能的要求。同一個運算符作用于不同類型的數(shù)據(jù)導(dǎo)致不同的行為。,12.1運算符重載概述,運算符重載只能對系統(tǒng)提供的已有運算定義新的運算含義,不能創(chuàng)造全新的運算符,同時還不能改變運算符原有的語法結(jié)構(gòu)、操作數(shù)個數(shù)、優(yōu)先級和結(jié)合性,不能有二義性。不是所有的運算符都能重載,不能重載的運算符有:作用域運算符(:)、條件運算符(?:)、直接成員訪問運算符(.)、sizeof運算符、解除對指向類成員的指針的引用運算符(.*)。運算符重載的關(guān)鍵字是operator。針對一個具體類的已有運算符重載有兩種途徑:1)將運算符重新定義為類的成員函數(shù);2)將運算符重新定義為類的友元函數(shù)。,一、運算符重載方法,定義一個重載運算符就像定義一個函數(shù),只是該函數(shù)的名字是operator,這里代表運算符。函數(shù)參數(shù)表中參數(shù)的個數(shù)取決于兩個因素:1)運算符是一元的(一個參數(shù))還是二元的(兩個參數(shù))。2)運算符被定義為友元函數(shù)(對于一元是一個參數(shù),對于二元是兩個參數(shù))還是成員函數(shù)(對于一元沒有參數(shù),對于二元是一個參數(shù)對象變?yōu)樽髠?cè)參數(shù))。,1.將運算符重載為類的成員函數(shù),將運算符重載為類的成員函數(shù)就是在類中用關(guān)鍵字operator定義一個成員函數(shù),函數(shù)名就是重載的運算符。運算符如果重載為類的成員函數(shù),它就可以自由地訪問該類的數(shù)據(jù)成員。運算符重載為類的成員函數(shù)的一般格式為::operator(形參表)函數(shù)體其中,類型為運算符重載函數(shù)的返回類型。類名為成員函數(shù)所屬類的類名,即為重載函數(shù)名。形參為參加運算的對象或數(shù)據(jù)。,【例題12.1】復(fù)數(shù)的加減運算符重載,#includeusingnamespacestd;classComplexprivate:floatreal,image;public:Complex(floatr=0,floati=0);ComplexAdd(constComplex,Complex:Complex(floatr,floati)real=r;image=i;voidComplex:Show(inti)/一般情況下,這里不應(yīng)該有參數(shù)i,本例的目的是為了區(qū)分不同的復(fù)數(shù),便于觀看結(jié)果cout0)cout<<"+"<<image<<"i"<<endl;if(image<0)cout<<image<<"i"<<endl;,ComplexComplex:Add(constComplex,ComplexComplex:operator-(constComplex,intmain()Complexc1(12,35),c2(20,46),c3,c4,c5,c6;c1.Show(1);c2.Show(2);c3=c1.Add(c2);c3.Show(3);c4=c1+c2;c4.Show(4);c2+=c1;c2.Show(2);c5=c1-c2;c5.Show(5);return0;,如果我們把“operator+”看成函數(shù)名,可以在main()函數(shù)中寫出如下語句:c3=c1.Add(c2);c3=c1.operator+(c2);這時,operator+就完全是一個函數(shù)了(它本質(zhì)上就是函數(shù)),.Add()和operator+的作用和功能完全相同,只是表現(xiàn)形式有些區(qū)別。,【例題12.2】一元運算符重載,在Time類(描述時間的類,用三個數(shù)據(jù)成員分別存放時、分和秒)中重載自加運算符,即一個時間加上n秒后形成一個新的的時間。,classTimeprivate:inthour,minute,second;public:Time(inth=0,intm=0,ints=0);/其他構(gòu)造函數(shù)省略如Time(Time,Time:Time(inth,intm,ints)hour=h;minute=m;second=s;voidTime:Show()cout<<hour<<":"<<minute<<":"<<second<<endl;,Time,TimeTime:operator+(int)/返回原來的值,再加Timetemp=*this;second+;if(second=60)second=0;minute+;if(minute=60)minute=0;hour+;if(hour=24)hour=0;returntemp;,Time,intmain()Timet1(10,25,52),t2,t3;t1.Show();t2=+t1;t1.Show();t2.Show();t3=t1+;t3.Show();t1.Show();,對于+(或-)運算符的重載,因為編譯器不能區(qū)分出+(或-)是前置的還是后置的,所以要加上(int)來區(qū)分。operator+();/重載前置+operator+(int);/重載后置+operator-();/重載前置-operator-(int);/重載后置-,運算符重載的一些特點如下:(1)運算符重載函數(shù)名必須為:operator。(2)運算符的重載是通過運算符重載函數(shù)來實現(xiàn)的。對于二元運算符重載函數(shù),函數(shù)的參數(shù)通常為一個即右操作數(shù),運算符的左操作數(shù)為調(diào)用重載函數(shù)的對象。對于一元運算符重載函數(shù),運算符的左操作數(shù)或右操作數(shù)為調(diào)用重載函數(shù)的對象。(3)運算符重載函數(shù)的返回類型:若對象進行運算后的結(jié)果類型仍為原類型,則運算符重載函數(shù)的返回類型應(yīng)為原類型。,【例11.3】自定義字符串類String中有一個private成員p_str指向一個C格式的字符串,寫出其拷貝構(gòu)造函數(shù),并重載賦值“=”運算符。,#include#includeusingnamespacestd;classStringpublic:String()p_str=NULL;String(constString,String:String(constchar*str)p_str=newcharstrlen(str)+1;strcpy(p_str,str);String:String(constString,String,賦值運算符重載一般包括以上幾個步驟,首先要檢查是否自賦值,如果是要立即返回,如果不返回,后面的語句會把自己所指空間刪掉,從而導(dǎo)致錯誤;第二步要釋放原有的內(nèi)存資源;第三步要分配新的內(nèi)存資源,并復(fù)制內(nèi)容;第四步是返回本對象的引用。如果沒有指針操作,則沒有第二步操作。賦值運算符與拷貝構(gòu)造函數(shù)在功能上有些類似,都是用一個對象去填另一個對象,但拷貝構(gòu)造函數(shù)是在對象建立的時候執(zhí)行,賦值運算符是在對象建立之后執(zhí)行。,2將運算符重載為類的友元函數(shù),二元運算符重載為友元函數(shù)的一般格式為:friendoperator(,);operator(,)函數(shù)體;一元運算符重載為友元函數(shù)的一般格式為:operator(類名classComplexprivate:floatreal,image;public:Complex(floatr=0,floati=0);friendComplexoperator+(constComplex,Complex:Complex(floatr,floati)real=r;image=i;voidComplex:Show(inti)cout0)cout<<"+"<<image<<"i"<<endl;if(image<0)cout<<image<<"i"<=,<,)等操作符必須定義為成員,將這些操作符定義為非成員函數(shù)在編譯時標(biāo)記為錯誤。2)像賦值一樣,復(fù)合賦值操作符通常應(yīng)定義為類的成員函數(shù)。定義成非成員函數(shù)不會出現(xiàn)編譯錯誤。3)改變對象狀態(tài)或與給定類型緊密聯(lián)系的其他一些操作符,如自增、自減等通常定義為類成員函數(shù)。4)對稱的操作符,如算術(shù)操作符、相等操作符、關(guān)系操作符和位操作符,最好定義為非成員函數(shù)。,istream和ostream是C+的預(yù)定義流類,cin是istream的對象,cout是ostream的對象。運算符>由istream重載為提取操作,用于輸出和輸入基本類型數(shù)據(jù)??捎弥剌d>運算符,用于輸出和輸入用戶自定義的數(shù)據(jù)類型,必須定義為類的友元函數(shù)。,4.重載流插入和流提取運算符,1)輸出操作符<<的重載輸出操作符重載函數(shù)形式為:ostream第一個參數(shù)和函數(shù)的類型都必須是ostreamclassDatepublic:Date(inty,intm,intd);boolisLeapYear();voidprint();friendostream#endif/DATE_H_INCLUDED,【例11.7】為Date類重載提取運算符(ex004.cpp),#include#include"Date.h"usingnamespacestd;Date:Date(inty,intm,intd)year=y;month=m;day=d;boolDate:isLeapYear()return(year%4=0,voidDate:print()cout<<year<<"-"<<month<<"-"<<day<<endl;ostream,#include#include"Date.h"usingnamespacestd;intmain()Dated1(2013,4,1);cout<<d1;return0;,在重載函數(shù)中,由于operator<<()函數(shù)是Date類的友元函數(shù),因此在使用Date類的數(shù)據(jù)成員和成員函數(shù)時必須指定對象。一般而言,輸出操作符應(yīng)該輸出對象的內(nèi)容,進行最小限度的格式化,不應(yīng)該輸出換行符。在主函數(shù)(main)中,cout的值被傳遞給output。由于函數(shù)返回的是ostream對象的引用,所以在主函數(shù)中可以將”<>的重載輸入操作符重載函數(shù)形式為:istream與輸出操作符類似,輸入操作符的第一個形參是一個引用,指向要讀的流,并且返回的也是同一個流的引用。第二個形參是對要讀入的對象的非const引用,該形參必須為非const,因為輸入操作符的目的是將數(shù)據(jù)讀到這個對象中。和輸出操作符不同的是輸入操作符必須處理錯誤和文件結(jié)束的可能性。,【例題11.8】重載輸入操作符,在上例的基礎(chǔ)上加上Date類對象能用“>>”輸入數(shù)據(jù)。,classDatepublic:Date()year=0;month=0;day=0;Date(inty,intm,intd);Date(strings);boolisLeapYear();private:intyear;intmonth;intday;friendostream,istream,intmain()Dated1(2013,3,20);cout>d2;cout<<d2<<endl;return0;,輸入操作符將讀入所期望的值并檢查是否發(fā)生錯誤??赡馨l(fā)生的錯誤有:1)提供的值不正確。如Date類對象中如果輸入了字符型數(shù)據(jù),讀入以及流的后續(xù)使用都將失敗。2)任何讀入都可能碰到輸入流中的文件結(jié)束或其他一些錯誤。如果輸入操作符檢測到輸入失敗了,則確保對象處于可用和一致的狀態(tài)是個好做法。如果對象在錯誤發(fā)生之前已經(jīng)寫入了部分信息,這樣做就特別重要。因此設(shè)計輸入操作符時,如果可能,要確定錯誤恢復(fù)措施,這是很重要的。例題11.8中如果輸入出現(xiàn)錯誤,將對象中的數(shù)據(jù)成員都設(shè)置為0,使得對象仍然處于可用狀態(tài),同時也不會產(chǎn)生令人誤解的結(jié)果。,12.2類型重載,C+中提供了類型轉(zhuǎn)換函數(shù),可以將一種類類型對象轉(zhuǎn)換成另一種類類型的對象,這就是類型重載。類型轉(zhuǎn)換函數(shù)必須由用戶在類中定義為成員函數(shù),其一般格式為:classpublic:operator();:operator()函數(shù)體;其中operator為轉(zhuǎn)換函數(shù)的函數(shù)名,轉(zhuǎn)換函數(shù)的作用是將類型1的對象轉(zhuǎn)換成類型2的對象。類中類型轉(zhuǎn)換函數(shù)必須是非靜態(tài)的成員函數(shù),不能定義成友元函數(shù),無返回值類型且不帶參數(shù)。,【例11.9】定義一個時間類,類中數(shù)據(jù)成員為時、分、秒。編寫類型轉(zhuǎn)換函數(shù),將時、分、秒變成一個以秒為單位的等價實數(shù)。,#includeusingnamespacestd;classTimeprivate:inthour,minute,second;public:Time(inth=0,intm=0,ints=0);voidShow();/顯示時:分:秒的成員函數(shù)operatorfloat();Time:Time(inth,intm,ints)hour=h;minute=m;second=s;,voidTime:Show()cout<<hour<<":"<<minute<<":"<<second<<endl;Time:operatorfloat()floatsec;sec=hour*3600+minute*60+second;/cout<<"second="<<sec<<endl;returnsec;,intmain()floats1,s2,s3;Timet(10,15,20);s1=t;s2=float(t);t.Show();s3=(float)t;cout<<"s1="<<s1<<t<<"s2="<<s2<<t<<"s3="<<s3<和.,

注意事項

本文(c課件運算符重載和類重載.ppt)為本站會員(max****ui)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!