c課件運(yùn)算符重載和類重載.ppt
《c課件運(yùn)算符重載和類重載.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《c課件運(yùn)算符重載和類重載.ppt(51頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第12章運(yùn)算符重載和類型重載,主要內(nèi)容:12.1運(yùn)算符重載規(guī)則12.2類型重載,在C+中有這樣的情況,同一個(gè)類型或運(yùn)算符在不同的類中代表不同的意思或者實(shí)施不同的運(yùn)算,這就是面向?qū)ο蟮娜筇攸c(diǎn)之一的多態(tài)。函數(shù)重載是C+語(yǔ)言中多態(tài)的一種表現(xiàn)形式,運(yùn)算符重載和類型重載是多態(tài)的另外兩種表現(xiàn)形式。,運(yùn)算符重載是對(duì)已有的運(yùn)算符賦予多重含義。C+中預(yù)定義的運(yùn)算符的操作對(duì)象只能是基本數(shù)據(jù)類型,對(duì)于很多用戶自定義類型,也需要有類似的運(yùn)算操作,這就提出了對(duì)運(yùn)算符進(jìn)行重新定義,賦予已有符號(hào)以新功能的要求。同一個(gè)運(yùn)算符作用于不同類型的數(shù)據(jù)導(dǎo)致不同的行為。,12.1運(yùn)算符重載概述,運(yùn)算符重載只能對(duì)系統(tǒng)提供的已有運(yùn)算定義新的運(yùn)算含義,不能創(chuàng)造全新的運(yùn)算符,同時(shí)還不能改變運(yùn)算符原有的語(yǔ)法結(jié)構(gòu)、操作數(shù)個(gè)數(shù)、優(yōu)先級(jí)和結(jié)合性,不能有二義性。不是所有的運(yùn)算符都能重載,不能重載的運(yùn)算符有:作用域運(yùn)算符(:)、條件運(yùn)算符(?:)、直接成員訪問運(yùn)算符(.)、sizeof運(yùn)算符、解除對(duì)指向類成員的指針的引用運(yùn)算符(.*)。運(yùn)算符重載的關(guān)鍵字是operator。針對(duì)一個(gè)具體類的已有運(yùn)算符重載有兩種途徑:1)將運(yùn)算符重新定義為類的成員函數(shù);2)將運(yùn)算符重新定義為類的友元函數(shù)。,一、運(yùn)算符重載方法,定義一個(gè)重載運(yùn)算符就像定義一個(gè)函數(shù),只是該函數(shù)的名字是operator,這里代表運(yùn)算符。函數(shù)參數(shù)表中參數(shù)的個(gè)數(shù)取決于兩個(gè)因素:1)運(yùn)算符是一元的(一個(gè)參數(shù))還是二元的(兩個(gè)參數(shù))。2)運(yùn)算符被定義為友元函數(shù)(對(duì)于一元是一個(gè)參數(shù),對(duì)于二元是兩個(gè)參數(shù))還是成員函數(shù)(對(duì)于一元沒有參數(shù),對(duì)于二元是一個(gè)參數(shù)對(duì)象變?yōu)樽髠?cè)參數(shù))。,1.將運(yùn)算符重載為類的成員函數(shù),將運(yùn)算符重載為類的成員函數(shù)就是在類中用關(guān)鍵字operator定義一個(gè)成員函數(shù),函數(shù)名就是重載的運(yùn)算符。運(yùn)算符如果重載為類的成員函數(shù),它就可以自由地訪問該類的數(shù)據(jù)成員。運(yùn)算符重載為類的成員函數(shù)的一般格式為::operator(形參表)函數(shù)體其中,類型為運(yùn)算符重載函數(shù)的返回類型。類名為成員函數(shù)所屬類的類名,即為重載函數(shù)名。形參為參加運(yùn)算的對(duì)象或數(shù)據(jù)。,【例題12.1】復(fù)數(shù)的加減運(yùn)算符重載,#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+imageiendl;if(image0)coutimageiendl;,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ù)中寫出如下語(yǔ)句:c3=c1.Add(c2);c3=c1.operator+(c2);這時(shí),operator+就完全是一個(gè)函數(shù)了(它本質(zhì)上就是函數(shù)),.Add()和operator+的作用和功能完全相同,只是表現(xiàn)形式有些區(qū)別。,【例題12.2】一元運(yùn)算符重載,在Time類(描述時(shí)間的類,用三個(gè)數(shù)據(jù)成員分別存放時(shí)、分和秒)中重載自加運(yùn)算符,即一個(gè)時(shí)間加上n秒后形成一個(gè)新的的時(shí)間。,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()couthour:minute:secondendl;,Time,TimeTime:operator+(int)/返回原來(lái)的值,再加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();,對(duì)于+(或-)運(yùn)算符的重載,因?yàn)榫幾g器不能區(qū)分出+(或-)是前置的還是后置的,所以要加上(int)來(lái)區(qū)分。operator+();/重載前置+operator+(int);/重載后置+operator-();/重載前置-operator-(int);/重載后置-,運(yùn)算符重載的一些特點(diǎn)如下:(1)運(yùn)算符重載函數(shù)名必須為:operator。(2)運(yùn)算符的重載是通過運(yùn)算符重載函數(shù)來(lái)實(shí)現(xiàn)的。對(duì)于二元運(yùn)算符重載函數(shù),函數(shù)的參數(shù)通常為一個(gè)即右操作數(shù),運(yùn)算符的左操作數(shù)為調(diào)用重載函數(shù)的對(duì)象。對(duì)于一元運(yùn)算符重載函數(shù),運(yùn)算符的左操作數(shù)或右操作數(shù)為調(diào)用重載函數(shù)的對(duì)象。(3)運(yùn)算符重載函數(shù)的返回類型:若對(duì)象進(jìn)行運(yùn)算后的結(jié)果類型仍為原類型,則運(yùn)算符重載函數(shù)的返回類型應(yīng)為原類型。,【例11.3】自定義字符串類String中有一個(gè)private成員p_str指向一個(gè)C格式的字符串,寫出其拷貝構(gòu)造函數(shù),并重載賦值“=”運(yùn)算符。,#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,賦值運(yùn)算符重載一般包括以上幾個(gè)步驟,首先要檢查是否自賦值,如果是要立即返回,如果不返回,后面的語(yǔ)句會(huì)把自己所指空間刪掉,從而導(dǎo)致錯(cuò)誤;第二步要釋放原有的內(nèi)存資源;第三步要分配新的內(nèi)存資源,并復(fù)制內(nèi)容;第四步是返回本對(duì)象的引用。如果沒有指針操作,則沒有第二步操作。賦值運(yùn)算符與拷貝構(gòu)造函數(shù)在功能上有些類似,都是用一個(gè)對(duì)象去填另一個(gè)對(duì)象,但拷貝構(gòu)造函數(shù)是在對(duì)象建立的時(shí)候執(zhí)行,賦值運(yùn)算符是在對(duì)象建立之后執(zhí)行。,2將運(yùn)算符重載為類的友元函數(shù),二元運(yùn)算符重載為友元函數(shù)的一般格式為:friendoperator(,);operator(,)函數(shù)體;一元運(yùn)算符重載為友元函數(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+imageiendl;if(image0)coutimagei=,由istream重載為提取操作,用于輸出和輸入基本類型數(shù)據(jù)。可用重載運(yùn)算符,用于輸出和輸入用戶自定義的數(shù)據(jù)類型,必須定義為類的友元函數(shù)。,4.重載流插入和流提取運(yùn)算符,1)輸出操作符的重載輸出操作符重載函數(shù)形式為:ostream第一個(gè)參數(shù)和函數(shù)的類型都必須是ostreamclassDatepublic:Date(inty,intm,intd);boolisLeapYear();voidprint();friendostream#endif/DATE_H_INCLUDED,【例11.7】為Date類重載提取運(yùn)算符(ex004.cpp),#include#includeDate.husingnamespacestd;Date:Date(inty,intm,intd)year=y;month=m;day=d;boolDate:isLeapYear()return(year%4=0,voidDate:print()coutyear-month-dayendl;ostream,#include#includeDate.husingnamespacestd;intmain()Dated1(2013,4,1);coutd1;return0;,在重載函數(shù)中,由于operator()函數(shù)是Date類的友元函數(shù),因此在使用Date類的數(shù)據(jù)成員和成員函數(shù)時(shí)必須指定對(duì)象。一般而言,輸出操作符應(yīng)該輸出對(duì)象的內(nèi)容,進(jìn)行最小限度的格式化,不應(yīng)該輸出換行符。在主函數(shù)(main)中,cout的值被傳遞給output。由于函數(shù)返回的是ostream對(duì)象的引用,所以在主函數(shù)中可以將”的重載輸入操作符重載函數(shù)形式為:istream與輸出操作符類似,輸入操作符的第一個(gè)形參是一個(gè)引用,指向要讀的流,并且返回的也是同一個(gè)流的引用。第二個(gè)形參是對(duì)要讀入的對(duì)象的非const引用,該形參必須為非const,因?yàn)檩斎氩僮鞣哪康氖菍?shù)據(jù)讀到這個(gè)對(duì)象中。和輸出操作符不同的是輸入操作符必須處理錯(cuò)誤和文件結(jié)束的可能性。,【例題11.8】重載輸入操作符,在上例的基礎(chǔ)上加上Date類對(duì)象能用“”輸入數(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);coutd2;coutd2endl;return0;,輸入操作符將讀入所期望的值并檢查是否發(fā)生錯(cuò)誤。可能發(fā)生的錯(cuò)誤有:1)提供的值不正確。如Date類對(duì)象中如果輸入了字符型數(shù)據(jù),讀入以及流的后續(xù)使用都將失敗。2)任何讀入都可能碰到輸入流中的文件結(jié)束或其他一些錯(cuò)誤。如果輸入操作符檢測(cè)到輸入失敗了,則確保對(duì)象處于可用和一致的狀態(tài)是個(gè)好做法。如果對(duì)象在錯(cuò)誤發(fā)生之前已經(jīng)寫入了部分信息,這樣做就特別重要。因此設(shè)計(jì)輸入操作符時(shí),如果可能,要確定錯(cuò)誤恢復(fù)措施,這是很重要的。例題11.8中如果輸入出現(xiàn)錯(cuò)誤,將對(duì)象中的數(shù)據(jù)成員都設(shè)置為0,使得對(duì)象仍然處于可用狀態(tài),同時(shí)也不會(huì)產(chǎn)生令人誤解的結(jié)果。,12.2類型重載,C+中提供了類型轉(zhuǎn)換函數(shù),可以將一種類類型對(duì)象轉(zhuǎn)換成另一種類類型的對(duì)象,這就是類型重載。類型轉(zhuǎn)換函數(shù)必須由用戶在類中定義為成員函數(shù),其一般格式為:classpublic:operator();:operator()函數(shù)體;其中operator為轉(zhuǎn)換函數(shù)的函數(shù)名,轉(zhuǎn)換函數(shù)的作用是將類型1的對(duì)象轉(zhuǎn)換成類型2的對(duì)象。類中類型轉(zhuǎn)換函數(shù)必須是非靜態(tài)的成員函數(shù),不能定義成友元函數(shù),無(wú)返回值類型且不帶參數(shù)。,【例11.9】定義一個(gè)時(shí)間類,類中數(shù)據(jù)成員為時(shí)、分、秒。編寫類型轉(zhuǎn)換函數(shù),將時(shí)、分、秒變成一個(gè)以秒為單位的等價(jià)實(shí)數(shù)。,#includeusingnamespacestd;classTimeprivate:inthour,minute,second;public:Time(inth=0,intm=0,ints=0);voidShow();/顯示時(shí):分:秒的成員函數(shù)operatorfloat();Time:Time(inth,intm,ints)hour=h;minute=m;second=s;,voidTime:Show()couthour:minute:secondendl;Time:operatorfloat()floatsec;sec=hour*3600+minute*60+second;/coutsecond=secendl;returnsec;,intmain()floats1,s2,s3;Timet(10,15,20);s1=t;s2=float(t);t.Show();s3=(float)t;couts1=s1ts2=s2ts3=s3和.,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 課件 運(yùn)算 重載
鏈接地址:http://ioszen.com/p-11549015.html