![C-面向?qū)ο蟪绦蛟O(shè)計_第1頁](http://file4.renrendoc.com/view/e50fb7148f9a2ff9d21ff8a30812cb53/e50fb7148f9a2ff9d21ff8a30812cb531.gif)
![C-面向?qū)ο蟪绦蛟O(shè)計_第2頁](http://file4.renrendoc.com/view/e50fb7148f9a2ff9d21ff8a30812cb53/e50fb7148f9a2ff9d21ff8a30812cb532.gif)
![C-面向?qū)ο蟪绦蛟O(shè)計_第3頁](http://file4.renrendoc.com/view/e50fb7148f9a2ff9d21ff8a30812cb53/e50fb7148f9a2ff9d21ff8a30812cb533.gif)
![C-面向?qū)ο蟪绦蛟O(shè)計_第4頁](http://file4.renrendoc.com/view/e50fb7148f9a2ff9d21ff8a30812cb53/e50fb7148f9a2ff9d21ff8a30812cb534.gif)
![C-面向?qū)ο蟪绦蛟O(shè)計_第5頁](http://file4.renrendoc.com/view/e50fb7148f9a2ff9d21ff8a30812cb53/e50fb7148f9a2ff9d21ff8a30812cb535.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C++面向?qū)ο蟪绦蛟O(shè)計第十章運算符重載與類模板1精選課件學(xué)習(xí)目標(biāo)⑴理解為什么要進(jìn)行運算符重載,在什么情況下要進(jìn)行運算符重載⑵掌握通過成員函數(shù)重載運算符,借助友元函數(shù)實現(xiàn)運算符重載⑶理解引用在運算符重載中的作用,引用作為參數(shù)和返回值的好處和用法⑷理解類型轉(zhuǎn)換的必要性,能夠在程序設(shè)計中正確應(yīng)用類型轉(zhuǎn)換⑸理解為什么要引入類模板的概念,掌握類模板的應(yīng)用2精選課件10.1為什么要進(jìn)行運算符重載10.1.1運算符重載的例子 在程序中,經(jīng)常會使用運算符,但C++中已經(jīng)定義的運算符都是針對基本數(shù)據(jù)類型的,那么能否將它們用于復(fù)雜的類對象呢?在學(xué)習(xí)本章之前,我們往往是編寫實現(xiàn)相應(yīng)運算功能的函數(shù)來解決復(fù)雜類型的運算問題。首先來看一個復(fù)數(shù)加法運算的例子,請注意程序中,加法運算時表達(dá)式的書寫形式?!纠?-1】復(fù)數(shù)的加運算。見教材P1333精選課件程序說明: 在【例10-1】為了解決復(fù)數(shù)的存儲問題,在復(fù)數(shù)類Complex中,定義了兩個私有成員變量:real(復(fù)數(shù)的實部)和imag(復(fù)數(shù)的虛部);并定義了公有的復(fù)數(shù)加法函數(shù)add()和友元輸出函數(shù)print()顯示復(fù)數(shù)。在main函數(shù)中定義了三個復(fù)數(shù)對象,使用加法函數(shù)add進(jìn)行3個復(fù)數(shù)的相加,并輸出結(jié)果。 在程序中三個復(fù)數(shù)相加的表達(dá)式為: c4=c1.add(c2).add(c3); 用這種方式書寫表達(dá)式,不僅形式復(fù)雜、不符合人們的日常書寫習(xí)慣,而且不易理解;復(fù)數(shù)的運算越復(fù)雜,書寫的表達(dá)式越困難,給使用自定義類編寫程序帶來諸多不便。如果能夠像使用基本類型那樣用運算符來書寫復(fù)數(shù)運算表達(dá)式(如c4=c1+c2+c3;),不僅書寫簡單,也更容易理解;這正是在C++中引入了運算符重載的意義所在。下面通過使用運算符重載進(jìn)行復(fù)數(shù)加運算例子來了解如何進(jìn)行運算符的重載。4精選課件【例10-2】使用運算符重載進(jìn)行復(fù)數(shù)加運算見教材P134輸出結(jié)果:11+2i程序說明: 該程序的作用和【例10-1】相同,只是用運算符重載函數(shù)代替了加法函數(shù)。 比較兩個程序不難發(fā)現(xiàn),【例10-2】中書寫的復(fù)數(shù)相加表達(dá)式,含義清晰,便于書寫。讓復(fù)數(shù)類的使用變得更加簡易。 程序中“+”運算符重載的定義如下: Complexoperator+(Complex&c); 它與一般函數(shù)的定義非常相似,不同的是運算符重載函數(shù)的名字(“operator+”)是由“operator”關(guān)鍵字和緊隨其后的運算符“+”組成;關(guān)鍵字“operator”表明該函數(shù)是一個運算符重載函數(shù)。在【例10-2】中,該函數(shù)是作為類Complex的成員函數(shù),因此把以這種方式的運算符重載稱作重載為類運算符。5精選課件【例10-3】重載為友元運算符進(jìn)行復(fù)數(shù)加運算見教材P136 輸出結(jié)果:11+2i 程序說明: 本例實現(xiàn)的功能與【例10-1】和【例10-2】完全相同。 本例中,“+”運算符重載函數(shù)的定義如下: Complexoperator+(Complex&c1,Complex&c2); 由于該函數(shù)是一般的普通函數(shù),不是類的成員函數(shù),只是為能夠訪問類的私有數(shù)據(jù)成員,而把其聲明為類的友元函數(shù),因此在定義時參數(shù)表中必須指定兩個參數(shù):第1個參數(shù)作為運算符的左操作數(shù),第2參數(shù)作為運算符的右操作數(shù)。6精選課件10.1.2注意事項C++對運算符重載作出了一定的限制和規(guī)定,在重載運算符時,需要注意以下幾點: ⑴不是所有運算符都可以被重載。C++的大部分運算符都可以被重載。可以重載的運算符如下:newnew[]deletedelete[]+-*/%^&|~=<>+=-=*-/=%=^=&=|=<<>>&&||++--->*->()[]其中,運算符()是函數(shù)調(diào)用運算符,[]是下標(biāo)運算符。+、-、*和&的一元、二元形式都可以被重載。自增運算符++和自減運算符--的前置、后置形式都可以被重載。以上可重載運算符中,除了賦值運算符"="之外,基類中所有被重載的運算符都將被派生類繼承。7精選課件不可以重載的運算符如下:.(成員運算符).*(成員對象選擇符)::(解析運算符)?:(條件運算符)⑵重載不能改變運算符的優(yōu)先級。假定已定義了復(fù)數(shù)類Complex,并且已定義了加法和乘法運算符重載函數(shù),Complexc1(1,2),c2(3,4),c3(5,6),answer;answer=c1+c2*c3;在這個表達(dá)式中,乘法運算優(yōu)先級高于加法運算,它等效于answer=c1+(c2*c3);如同系統(tǒng)定義數(shù)據(jù)類型一樣,可以使用括號強制改變重載運算符的計算順序,例如:answer=(c1+c2)*c3;⑶重載不能改變運算符的結(jié)合律。8精選課件⑷重載不能改變運算符的操作數(shù)個數(shù)。重載的一元運算符仍然是一元運算符,重載的二元運算符仍然是二元運算符。C++中唯一的三元運算符(?:)不能被重載。運算符+、-、*、&和~既可以用作一元運算符和二元運算符,對這幾個運算符,要分別把他們重載為一元運算符和二元運算符。⑸不能創(chuàng)建新的運算符,只有現(xiàn)用的運算符才能被重載。⑹運算符重載函數(shù)的參數(shù)至少有一個必須是類的對象或者是類的對象的引用。⑺運算符只能被顯式重載(不存在隱式重載),例如,運算符"+"和"="已被分別重載,這不意味著運算符"+="或"=="已被重載。⑻運算符重載函數(shù)不能帶有缺省參數(shù)。⑼重載運算符時,要保持語義上的一致性。例如,重載運算符"+"時,仍應(yīng)對有關(guān)對象執(zhí)行加法運算。當(dāng)然,也可以定義為其它某種運算,但這樣做既沒有必要,也容易造成混亂。⑽C++規(guī)定,“=、()、[]、->”四種運算符必須重載為類運算符。9精選課件10.2賦值運算符和四則運算符的重載 對名為T的類,其賦值運算符重載函數(shù)的格式如下: Toperator=(T&); 由于賦值運算符只能重載為類運算符,所以這是賦值運算符重載函數(shù)的唯一格式。 對名為T的類,其二元運算符(用#表示)重載函數(shù)的格式如下: Toperator#(T&);//重載為類成員運算符 或 Toperatore#(T&,T&);//重載為非類成員運算符 四則運算符屬于二元運算符,也可以使用這兩種形式。 下面仍以復(fù)數(shù)運算為例,說明賦值運算符和四則運算符的重載。 【例10-4】復(fù)數(shù)的四則運算見教材P13810精選課件10.3自增1和自減1運算符重載自增1運算符“++”和自減1運算符“--”都各有兩種形式:前綴(前運算)和后綴(后運算)。例如,++a是前運算符:在進(jìn)行其他運算前,變量a首先增1。a++是后運算符:做完其他運算后,a才增1。這四種形式的每一種都可以重載。增1運算符和減1運算符都只有一個操作數(shù),通常被重載為類運算符。一元類運算符重載函數(shù)的參數(shù)表理應(yīng)沒有參數(shù)(操作數(shù)即是類對象本身),但為了區(qū)分前運算和后運算這兩種形式,C++中規(guī)定:前運算符重載函數(shù)的參數(shù)表沒有參數(shù);后運算符重載函數(shù)的參數(shù)表設(shè)一個整數(shù)參數(shù),這個參數(shù)稱為啞元,只作為一個標(biāo)志,用以區(qū)別前運算符。所以,對名為T的類,重載前運算符和后運算符的函數(shù)原型取如下格式:Toperator++();//重載前增1運算符Toperator++(int);//重載后增1運算符Toperator--();//重載前減1運算符Toperator--(int);//重載后減1運算符為了說明增1運算符和減1運算符重載,下面給出一個分?jǐn)?shù)類作自增,自減的例子。【例6-5】分?jǐn)?shù)類的自增,自減。見教材P14211精選課件10.4關(guān)系運算符的重載在C++中對于使用內(nèi)部數(shù)據(jù)類型定義的變量,可以使用六個關(guān)系運算符“<、>、<=、>=、==和!=”進(jìn)行比較運算。而要對自定義類定義的變量進(jìn)行比較運算,用戶就必須重載這些運算符。下面以分?jǐn)?shù)的>為例說明關(guān)系運算符的重載?!纠?0-6】比較兩個分?jǐn)?shù)大小,輸出值大的分?jǐn)?shù)。見教材P14412精選課件10.5算術(shù)賦值運算符的重載在C++中允許把算術(shù)運算符和賦值運算符組合在一起使用,這種書寫方法簡潔高效;同樣也可以在自定義類型中重載這些運算符。為了簡單起見,仍然使用分?jǐn)?shù)的例子。【例10-7】分?jǐn)?shù)的加法運算。見教材P14513精選課件10.6下標(biāo)運算符的重載“[]”下標(biāo)運算符通常用于數(shù)組,c++也允許重載這個運算符,在重載這個運算符時,需要注意的是:當(dāng)“[]”運算符位于“=”左邊時,是修改數(shù)組中元素的值,需要返回這個元素的指針或引用;當(dāng)“[]”運算符位于“=”右邊時,是取得數(shù)組中元素的值,需要返回這個元素的值或引用;為了能使“[]”運算符即可用于“=”左邊,也可用于“=”右邊,在重載“[]”運算符時,必須返回該元素的引用。下面給出一個數(shù)組類的例子來說明這一問題。 【例10-8】一個數(shù)組類的例子。見教材P14714精選課件10.7插入與抽取運算符的重載10.7.1插入運算符的重載 C++中對左移運算符“<<”進(jìn)行重載,以便輸出C++內(nèi)部類型的數(shù)據(jù)。對于自定義類型也可以重載運算符“<<”,按照合適的方式輸出自定義類型的對象。下面以分?jǐn)?shù)的輸出為例介紹?!纠?0-9】分?jǐn)?shù)的輸出。見教材P14915精選課件10.7.2抽取運算符的重載C++中對右移運算符“>>”進(jìn)行重載,以便把外來的信息輸入到所有的C++內(nèi)部數(shù)據(jù)類型的變量,這些重載函數(shù)作為系統(tǒng)類的成員函數(shù)。例如,如果i是一個整型變量,C++便將輸入語句cin>>i;翻譯為cin.operator>>(i);然后調(diào)用此函數(shù),讀取一個值,存入變量i中。為了支持自定義類型,用戶應(yīng)重載輸入運算符“>>”。在重載時,如果作為一般的函數(shù)來定義(而非類的成員函數(shù)),則這個重載運算符在被使用時應(yīng)被聲明為類的友元運算符。因為“>>”的第一個操作數(shù)是系統(tǒng)類的對象cin(系統(tǒng)類iostream的對象),因此,作為友元函數(shù),類X的輸入運算符重載函數(shù)的原型應(yīng)為:istream&operator>>(istream&,X&);請注意:這個函數(shù)的第一個參數(shù)是輸入流的引用,第二個參數(shù)是類X的引用。函數(shù)返回輸入流的引用,其目的是為了能連續(xù)輸入。對此,可以仿照6.7.1節(jié)做出解釋。【例10-10】分?jǐn)?shù)的輸入。見教材P15116精選課件10.8類型轉(zhuǎn)換 在C++中,當(dāng)使用數(shù)值類型進(jìn)行計算時,各種類型之間可以隱式或強制轉(zhuǎn)換;例如: doubled; inta=2; d=a+5.3; 這種書寫方式,使代碼看起來優(yōu)雅而自然。在用戶自定義類中,沒有進(jìn)行類似的定義而無法使用這種方法。17精選課件10.8.1基本類型轉(zhuǎn)換和自定義類型的相互轉(zhuǎn)換在定義了類型轉(zhuǎn)換后,對所有TRangeInt類型變量的計算都可以先轉(zhuǎn)換成int類型,再進(jìn)行計算,因此,可以不需要進(jìn)行運算符的重載(如下面例子中的“+”、“-”運算符)?!纠?0-11】TRangeInt類型的加、減運算。見教材P15418精選課件10.8.2自定義類型之間的轉(zhuǎn)換有兩種方法可以實現(xiàn)自定義類型之間的轉(zhuǎn)換:使用類型轉(zhuǎn)換符函數(shù)和構(gòu)造函數(shù)。不僅可以在基本類型轉(zhuǎn)換和自定義類型之間實現(xiàn)類型的轉(zhuǎn)換,也可以在兩個自定義類型之間實現(xiàn)。【例10-12】使用類型轉(zhuǎn)換符函數(shù)實現(xiàn)二維向量類型和復(fù)數(shù)類型的相互轉(zhuǎn)換。見教材P15519精選課件【例10-13】使用構(gòu)造函數(shù)實現(xiàn)二維向量類型和復(fù)數(shù)類型的相互轉(zhuǎn)換。程序見教材P15720精選課件10.9類模板與模板類在編寫程序時,有許多類的工作機制是相同的,只是其使用的數(shù)據(jù)類型不同。鏈表就是一個較為典型的例子,可以有整型鏈表、結(jié)構(gòu)鏈表或自定義類的鏈表,但就鏈表本身的操作來說是相同的。在鏈表操作時,如果能夠把要處理的類型當(dāng)作參數(shù),就可以構(gòu)建一個通用的鏈表類。類模板的定義格式如下:template<classT>class類名{……}21精選課件這里template<classT>是指出在所定義的類中,將使用到一個參數(shù)的類型為T;編譯時,類型T將被調(diào)用時的具體類型替換,產(chǎn)生一個具體的類,稱為模板類(由模板產(chǎn)生的類)。來看一個具體的例子:單向鏈表,其結(jié)構(gòu)圖6.1所示。這里的數(shù)據(jù)可以是任意類型的,而對于任一個單向鏈表,其操作都是相同的;單向鏈表都具有增加、刪除、尋找、遍歷等操作鏈?zhǔn)字羔樄?jié)點指針數(shù)據(jù)節(jié)點指針數(shù)據(jù)節(jié)點指針數(shù)據(jù)圖10.1單向鏈表22精選課件【例10-14】通用鏈表類的定義。程序見教材P15923精選課件本章小結(jié)本章介紹了C++中,運算符重載和類型轉(zhuǎn)換的概念,舉例說明了運算符重載和類型轉(zhuǎn)換的用法。使用運算符重載可以使程序易于理解并易于對對象進(jìn)行操作。幾乎所有的C++運算符都可以被重載。如果在類中沒有說明本身的拷貝構(gòu)造函數(shù)和賦值運算符,編譯程序?qū)峁?,但它們都只是對對象進(jìn)行成員淺拷貝。this指
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年帶鋼傳輸自動糾偏裝置合作協(xié)議書
- 2025年濕法稀磷酸合作協(xié)議書
- 2025年單、雙長鏈烷基甲基叔胺合作協(xié)議書
- 2025年人投資入股協(xié)議(三篇)
- 2025年二手房貸款擔(dān)保合同(三篇)
- 2025年企業(yè)住所租賃合同范文(2篇)
- 2025年中央空調(diào)供貨合同(2篇)
- 2025年個人美容院轉(zhuǎn)讓合同范文(2篇)
- 2025年二年級語文教研活動總結(jié)(二篇)
- 2025年個人小型房屋租賃合同(三篇)
- 2025民政局離婚協(xié)議書范本(民政局官方)4篇
- 2024年03月四川農(nóng)村商業(yè)聯(lián)合銀行信息科技部2024年校園招考300名工作人員筆試歷年參考題庫附帶答案詳解
- 小學(xué)一年級數(shù)學(xué)上冊口算練習(xí)題總匯
- 睡眠專業(yè)知識培訓(xùn)課件
- 潤滑油知識-液壓油
- 2024年江蘇省中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 臨床思維能力培養(yǎng)
- 人教版高中物理必修第三冊第十章靜電場中的能量10-1電勢能和電勢練習(xí)含答案
- 《工程勘察設(shè)計收費標(biāo)準(zhǔn)》(2002年修訂本)
- 中國宗教文化 中國古代宗教文化的特點及現(xiàn)代意義
- 2024年四川省巴中市級事業(yè)單位選聘15人歷年高頻難、易錯點練習(xí)500題附帶答案詳解
評論
0/150
提交評論