C-面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)
C-面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)
C-面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)
C-面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)
C-面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++面向?qū)ο蟪绦蛟O(shè)計(jì)第十章運(yùn)算符重載與類(lèi)模板1精選課件學(xué)習(xí)目標(biāo)⑴理解為什么要進(jìn)行運(yùn)算符重載,在什么情況下要進(jìn)行運(yùn)算符重載⑵掌握通過(guò)成員函數(shù)重載運(yùn)算符,借助友元函數(shù)實(shí)現(xiàn)運(yùn)算符重載⑶理解引用在運(yùn)算符重載中的作用,引用作為參數(shù)和返回值的好處和用法⑷理解類(lèi)型轉(zhuǎn)換的必要性,能夠在程序設(shè)計(jì)中正確應(yīng)用類(lèi)型轉(zhuǎn)換⑸理解為什么要引入類(lèi)模板的概念,掌握類(lèi)模板的應(yīng)用2精選課件10.1為什么要進(jìn)行運(yùn)算符重載10.1.1運(yùn)算符重載的例子 在程序中,經(jīng)常會(huì)使用運(yùn)算符,但C++中已經(jīng)定義的運(yùn)算符都是針對(duì)基本數(shù)據(jù)類(lèi)型的,那么能否將它們用于復(fù)雜的類(lèi)對(duì)象呢?在學(xué)習(xí)本章之前,我們往往是編寫(xiě)實(shí)現(xiàn)相應(yīng)運(yùn)算功能的函數(shù)來(lái)解決復(fù)雜類(lèi)型的運(yùn)算問(wèn)題。首先來(lái)看一個(gè)復(fù)數(shù)加法運(yùn)算的例子,請(qǐng)注意程序中,加法運(yùn)算時(shí)表達(dá)式的書(shū)寫(xiě)形式?!纠?-1】復(fù)數(shù)的加運(yùn)算。見(jiàn)教材P1333精選課件程序說(shuō)明: 在【例10-1】為了解決復(fù)數(shù)的存儲(chǔ)問(wèn)題,在復(fù)數(shù)類(lèi)Complex中,定義了兩個(gè)私有成員變量:real(復(fù)數(shù)的實(shí)部)和imag(復(fù)數(shù)的虛部);并定義了公有的復(fù)數(shù)加法函數(shù)add()和友元輸出函數(shù)print()顯示復(fù)數(shù)。在main函數(shù)中定義了三個(gè)復(fù)數(shù)對(duì)象,使用加法函數(shù)add進(jìn)行3個(gè)復(fù)數(shù)的相加,并輸出結(jié)果。 在程序中三個(gè)復(fù)數(shù)相加的表達(dá)式為: c4=c1.add(c2).add(c3); 用這種方式書(shū)寫(xiě)表達(dá)式,不僅形式復(fù)雜、不符合人們的日常書(shū)寫(xiě)習(xí)慣,而且不易理解;復(fù)數(shù)的運(yùn)算越復(fù)雜,書(shū)寫(xiě)的表達(dá)式越困難,給使用自定義類(lèi)編寫(xiě)程序帶來(lái)諸多不便。如果能夠像使用基本類(lèi)型那樣用運(yùn)算符來(lái)書(shū)寫(xiě)復(fù)數(shù)運(yùn)算表達(dá)式(如c4=c1+c2+c3;),不僅書(shū)寫(xiě)簡(jiǎn)單,也更容易理解;這正是在C++中引入了運(yùn)算符重載的意義所在。下面通過(guò)使用運(yùn)算符重載進(jìn)行復(fù)數(shù)加運(yùn)算例子來(lái)了解如何進(jìn)行運(yùn)算符的重載。4精選課件【例10-2】使用運(yùn)算符重載進(jìn)行復(fù)數(shù)加運(yùn)算見(jiàn)教材P134輸出結(jié)果:11+2i程序說(shuō)明: 該程序的作用和【例10-1】相同,只是用運(yùn)算符重載函數(shù)代替了加法函數(shù)。 比較兩個(gè)程序不難發(fā)現(xiàn),【例10-2】中書(shū)寫(xiě)的復(fù)數(shù)相加表達(dá)式,含義清晰,便于書(shū)寫(xiě)。讓復(fù)數(shù)類(lèi)的使用變得更加簡(jiǎn)易。 程序中“+”運(yùn)算符重載的定義如下: Complexoperator+(Complex&c); 它與一般函數(shù)的定義非常相似,不同的是運(yùn)算符重載函數(shù)的名字(“operator+”)是由“operator”關(guān)鍵字和緊隨其后的運(yùn)算符“+”組成;關(guān)鍵字“operator”表明該函數(shù)是一個(gè)運(yùn)算符重載函數(shù)。在【例10-2】中,該函數(shù)是作為類(lèi)Complex的成員函數(shù),因此把以這種方式的運(yùn)算符重載稱(chēng)作重載為類(lèi)運(yùn)算符。5精選課件【例10-3】重載為友元運(yùn)算符進(jìn)行復(fù)數(shù)加運(yùn)算見(jiàn)教材P136 輸出結(jié)果:11+2i 程序說(shuō)明: 本例實(shí)現(xiàn)的功能與【例10-1】和【例10-2】完全相同。 本例中,“+”運(yùn)算符重載函數(shù)的定義如下: Complexoperator+(Complex&c1,Complex&c2); 由于該函數(shù)是一般的普通函數(shù),不是類(lèi)的成員函數(shù),只是為能夠訪(fǎng)問(wèn)類(lèi)的私有數(shù)據(jù)成員,而把其聲明為類(lèi)的友元函數(shù),因此在定義時(shí)參數(shù)表中必須指定兩個(gè)參數(shù):第1個(gè)參數(shù)作為運(yùn)算符的左操作數(shù),第2參數(shù)作為運(yùn)算符的右操作數(shù)。6精選課件10.1.2注意事項(xiàng)C++對(duì)運(yùn)算符重載作出了一定的限制和規(guī)定,在重載運(yùn)算符時(shí),需要注意以下幾點(diǎn): ⑴不是所有運(yùn)算符都可以被重載。C++的大部分運(yùn)算符都可以被重載??梢灾剌d的運(yùn)算符如下:newnew[]deletedelete[]+-*/%^&|~=<>+=-=*-/=%=^=&=|=<<>>&&||++--->*->()[]其中,運(yùn)算符()是函數(shù)調(diào)用運(yùn)算符,[]是下標(biāo)運(yùn)算符。+、-、*和&的一元、二元形式都可以被重載。自增運(yùn)算符++和自減運(yùn)算符--的前置、后置形式都可以被重載。以上可重載運(yùn)算符中,除了賦值運(yùn)算符"="之外,基類(lèi)中所有被重載的運(yùn)算符都將被派生類(lèi)繼承。7精選課件不可以重載的運(yùn)算符如下:.(成員運(yùn)算符).*(成員對(duì)象選擇符)::(解析運(yùn)算符)?:(條件運(yùn)算符)⑵重載不能改變運(yùn)算符的優(yōu)先級(jí)。假定已定義了復(fù)數(shù)類(lèi)Complex,并且已定義了加法和乘法運(yùn)算符重載函數(shù),Complexc1(1,2),c2(3,4),c3(5,6),answer;answer=c1+c2*c3;在這個(gè)表達(dá)式中,乘法運(yùn)算優(yōu)先級(jí)高于加法運(yùn)算,它等效于answer=c1+(c2*c3);如同系統(tǒng)定義數(shù)據(jù)類(lèi)型一樣,可以使用括號(hào)強(qiáng)制改變重載運(yùn)算符的計(jì)算順序,例如:answer=(c1+c2)*c3;⑶重載不能改變運(yùn)算符的結(jié)合律。8精選課件⑷重載不能改變運(yùn)算符的操作數(shù)個(gè)數(shù)。重載的一元運(yùn)算符仍然是一元運(yùn)算符,重載的二元運(yùn)算符仍然是二元運(yùn)算符。C++中唯一的三元運(yùn)算符(?:)不能被重載。運(yùn)算符+、-、*、&和~既可以用作一元運(yùn)算符和二元運(yùn)算符,對(duì)這幾個(gè)運(yùn)算符,要分別把他們重載為一元運(yùn)算符和二元運(yùn)算符。⑸不能創(chuàng)建新的運(yùn)算符,只有現(xiàn)用的運(yùn)算符才能被重載。⑹運(yùn)算符重載函數(shù)的參數(shù)至少有一個(gè)必須是類(lèi)的對(duì)象或者是類(lèi)的對(duì)象的引用。⑺運(yùn)算符只能被顯式重載(不存在隱式重載),例如,運(yùn)算符"+"和"="已被分別重載,這不意味著運(yùn)算符"+="或"=="已被重載。⑻運(yùn)算符重載函數(shù)不能帶有缺省參數(shù)。⑼重載運(yùn)算符時(shí),要保持語(yǔ)義上的一致性。例如,重載運(yùn)算符"+"時(shí),仍應(yīng)對(duì)有關(guān)對(duì)象執(zhí)行加法運(yùn)算。當(dāng)然,也可以定義為其它某種運(yùn)算,但這樣做既沒(méi)有必要,也容易造成混亂。⑽C++規(guī)定,“=、()、[]、->”四種運(yùn)算符必須重載為類(lèi)運(yùn)算符。9精選課件10.2賦值運(yùn)算符和四則運(yùn)算符的重載 對(duì)名為T(mén)的類(lèi),其賦值運(yùn)算符重載函數(shù)的格式如下: Toperator=(T&); 由于賦值運(yùn)算符只能重載為類(lèi)運(yùn)算符,所以這是賦值運(yùn)算符重載函數(shù)的唯一格式。 對(duì)名為T(mén)的類(lèi),其二元運(yùn)算符(用#表示)重載函數(shù)的格式如下: Toperator#(T&);//重載為類(lèi)成員運(yùn)算符 或 Toperatore#(T&,T&);//重載為非類(lèi)成員運(yùn)算符 四則運(yùn)算符屬于二元運(yùn)算符,也可以使用這兩種形式。 下面仍以復(fù)數(shù)運(yùn)算為例,說(shuō)明賦值運(yùn)算符和四則運(yùn)算符的重載。 【例10-4】復(fù)數(shù)的四則運(yùn)算見(jiàn)教材P13810精選課件10.3自增1和自減1運(yùn)算符重載自增1運(yùn)算符“++”和自減1運(yùn)算符“--”都各有兩種形式:前綴(前運(yùn)算)和后綴(后運(yùn)算)。例如,++a是前運(yùn)算符:在進(jìn)行其他運(yùn)算前,變量a首先增1。a++是后運(yùn)算符:做完其他運(yùn)算后,a才增1。這四種形式的每一種都可以重載。增1運(yùn)算符和減1運(yùn)算符都只有一個(gè)操作數(shù),通常被重載為類(lèi)運(yùn)算符。一元類(lèi)運(yùn)算符重載函數(shù)的參數(shù)表理應(yīng)沒(méi)有參數(shù)(操作數(shù)即是類(lèi)對(duì)象本身),但為了區(qū)分前運(yùn)算和后運(yùn)算這兩種形式,C++中規(guī)定:前運(yùn)算符重載函數(shù)的參數(shù)表沒(méi)有參數(shù);后運(yùn)算符重載函數(shù)的參數(shù)表設(shè)一個(gè)整數(shù)參數(shù),這個(gè)參數(shù)稱(chēng)為啞元,只作為一個(gè)標(biāo)志,用以區(qū)別前運(yùn)算符。所以,對(duì)名為T(mén)的類(lèi),重載前運(yùn)算符和后運(yùn)算符的函數(shù)原型取如下格式:Toperator++();//重載前增1運(yùn)算符Toperator++(int);//重載后增1運(yùn)算符Toperator--();//重載前減1運(yùn)算符Toperator--(int);//重載后減1運(yùn)算符為了說(shuō)明增1運(yùn)算符和減1運(yùn)算符重載,下面給出一個(gè)分?jǐn)?shù)類(lèi)作自增,自減的例子。【例6-5】分?jǐn)?shù)類(lèi)的自增,自減。見(jiàn)教材P14211精選課件10.4關(guān)系運(yùn)算符的重載在C++中對(duì)于使用內(nèi)部數(shù)據(jù)類(lèi)型定義的變量,可以使用六個(gè)關(guān)系運(yùn)算符“<、>、<=、>=、==和!=”進(jìn)行比較運(yùn)算。而要對(duì)自定義類(lèi)定義的變量進(jìn)行比較運(yùn)算,用戶(hù)就必須重載這些運(yùn)算符。下面以分?jǐn)?shù)的>為例說(shuō)明關(guān)系運(yùn)算符的重載?!纠?0-6】比較兩個(gè)分?jǐn)?shù)大小,輸出值大的分?jǐn)?shù)。見(jiàn)教材P14412精選課件10.5算術(shù)賦值運(yùn)算符的重載在C++中允許把算術(shù)運(yùn)算符和賦值運(yùn)算符組合在一起使用,這種書(shū)寫(xiě)方法簡(jiǎn)潔高效;同樣也可以在自定義類(lèi)型中重載這些運(yùn)算符。為了簡(jiǎn)單起見(jiàn),仍然使用分?jǐn)?shù)的例子。【例10-7】分?jǐn)?shù)的加法運(yùn)算。見(jiàn)教材P14513精選課件10.6下標(biāo)運(yùn)算符的重載“[]”下標(biāo)運(yùn)算符通常用于數(shù)組,c++也允許重載這個(gè)運(yùn)算符,在重載這個(gè)運(yùn)算符時(shí),需要注意的是:當(dāng)“[]”運(yùn)算符位于“=”左邊時(shí),是修改數(shù)組中元素的值,需要返回這個(gè)元素的指針或引用;當(dāng)“[]”運(yùn)算符位于“=”右邊時(shí),是取得數(shù)組中元素的值,需要返回這個(gè)元素的值或引用;為了能使“[]”運(yùn)算符即可用于“=”左邊,也可用于“=”右邊,在重載“[]”運(yùn)算符時(shí),必須返回該元素的引用。下面給出一個(gè)數(shù)組類(lèi)的例子來(lái)說(shuō)明這一問(wèn)題。 【例10-8】一個(gè)數(shù)組類(lèi)的例子。見(jiàn)教材P14714精選課件10.7插入與抽取運(yùn)算符的重載10.7.1插入運(yùn)算符的重載 C++中對(duì)左移運(yùn)算符“<<”進(jìn)行重載,以便輸出C++內(nèi)部類(lèi)型的數(shù)據(jù)。對(duì)于自定義類(lèi)型也可以重載運(yùn)算符“<<”,按照合適的方式輸出自定義類(lèi)型的對(duì)象。下面以分?jǐn)?shù)的輸出為例介紹?!纠?0-9】分?jǐn)?shù)的輸出。見(jiàn)教材P14915精選課件10.7.2抽取運(yùn)算符的重載C++中對(duì)右移運(yùn)算符“>>”進(jìn)行重載,以便把外來(lái)的信息輸入到所有的C++內(nèi)部數(shù)據(jù)類(lèi)型的變量,這些重載函數(shù)作為系統(tǒng)類(lèi)的成員函數(shù)。例如,如果i是一個(gè)整型變量,C++便將輸入語(yǔ)句cin>>i;翻譯為cin.operator>>(i);然后調(diào)用此函數(shù),讀取一個(gè)值,存入變量i中。為了支持自定義類(lèi)型,用戶(hù)應(yīng)重載輸入運(yùn)算符“>>”。在重載時(shí),如果作為一般的函數(shù)來(lái)定義(而非類(lèi)的成員函數(shù)),則這個(gè)重載運(yùn)算符在被使用時(shí)應(yīng)被聲明為類(lèi)的友元運(yùn)算符。因?yàn)椤?gt;>”的第一個(gè)操作數(shù)是系統(tǒng)類(lèi)的對(duì)象cin(系統(tǒng)類(lèi)iostream的對(duì)象),因此,作為友元函數(shù),類(lèi)X的輸入運(yùn)算符重載函數(shù)的原型應(yīng)為:istream&operator>>(istream&,X&);請(qǐng)注意:這個(gè)函數(shù)的第一個(gè)參數(shù)是輸入流的引用,第二個(gè)參數(shù)是類(lèi)X的引用。函數(shù)返回輸入流的引用,其目的是為了能連續(xù)輸入。對(duì)此,可以仿照6.7.1節(jié)做出解釋。【例10-10】分?jǐn)?shù)的輸入。見(jiàn)教材P15116精選課件10.8類(lèi)型轉(zhuǎn)換 在C++中,當(dāng)使用數(shù)值類(lèi)型進(jìn)行計(jì)算時(shí),各種類(lèi)型之間可以隱式或強(qiáng)制轉(zhuǎn)換;例如: doubled; inta=2; d=a+5.3; 這種書(shū)寫(xiě)方式,使代碼看起來(lái)優(yōu)雅而自然。在用戶(hù)自定義類(lèi)中,沒(méi)有進(jìn)行類(lèi)似的定義而無(wú)法使用這種方法。17精選課件10.8.1基本類(lèi)型轉(zhuǎn)換和自定義類(lèi)型的相互轉(zhuǎn)換在定義了類(lèi)型轉(zhuǎn)換后,對(duì)所有TRangeInt類(lèi)型變量的計(jì)算都可以先轉(zhuǎn)換成int類(lèi)型,再進(jìn)行計(jì)算,因此,可以不需要進(jìn)行運(yùn)算符的重載(如下面例子中的“+”、“-”運(yùn)算符)?!纠?0-11】TRangeInt類(lèi)型的加、減運(yùn)算。見(jiàn)教材P15418精選課件10.8.2自定義類(lèi)型之間的轉(zhuǎn)換有兩種方法可以實(shí)現(xiàn)自定義類(lèi)型之間的轉(zhuǎn)換:使用類(lèi)型轉(zhuǎn)換符函數(shù)和構(gòu)造函數(shù)。不僅可以在基本類(lèi)型轉(zhuǎn)換和自定義類(lèi)型之間實(shí)現(xiàn)類(lèi)型的轉(zhuǎn)換,也可以在兩個(gè)自定義類(lèi)型之間實(shí)現(xiàn)?!纠?0-12】使用類(lèi)型轉(zhuǎn)換符函數(shù)實(shí)現(xiàn)二維向量類(lèi)型和復(fù)數(shù)類(lèi)型的相互轉(zhuǎn)換。見(jiàn)教材P15519精選課件【例10-13】使用構(gòu)造函數(shù)實(shí)現(xiàn)二維向量類(lèi)型和復(fù)數(shù)類(lèi)型的相互轉(zhuǎn)換。程序見(jiàn)教材P15720精選課件10.9類(lèi)模板與模板類(lèi)在編寫(xiě)程序時(shí),有許多類(lèi)的工作機(jī)制是相同的,只是其使用的數(shù)據(jù)類(lèi)型不同。鏈表就是一個(gè)較為典型的例子,可以有整型鏈表、結(jié)構(gòu)鏈表或自定義類(lèi)的鏈表,但就鏈表本身的操作來(lái)說(shuō)是相同的。在鏈表操作時(shí),如果能夠把要處理的類(lèi)型當(dāng)作參數(shù),就可以構(gòu)建一個(gè)通用的鏈表類(lèi)。類(lèi)模板的定義格式如下:template<classT>class類(lèi)名{……}21精選課件這里template<classT>是指出在所定義的類(lèi)中,將使用到一個(gè)參數(shù)的類(lèi)型為T(mén);編譯時(shí),類(lèi)型T將被調(diào)用時(shí)的具體類(lèi)型替換,產(chǎn)生一個(gè)具體的類(lèi),稱(chēng)為模板類(lèi)(由模板產(chǎn)生的類(lèi))。來(lái)看一個(gè)具體的例子:?jiǎn)蜗蜴湵?,其結(jié)構(gòu)圖6.1所示。這里的數(shù)據(jù)可以是任意類(lèi)型的,而對(duì)于任一個(gè)單向鏈表,其操作都是相同的;單向鏈表都具有增加、刪除、尋找、遍歷等操作鏈?zhǔn)字羔樄?jié)點(diǎn)指針數(shù)據(jù)節(jié)點(diǎn)指針數(shù)據(jù)節(jié)點(diǎn)指針數(shù)據(jù)圖10.1單向鏈表22精選課件【例10-14】通用鏈表類(lèi)的定義。程序見(jiàn)教材P15923精選課件本章小結(jié)本章介紹了C++中,運(yùn)算符重載和類(lèi)型轉(zhuǎn)換的概念,舉例說(shuō)明了運(yùn)算符重載和類(lèi)型轉(zhuǎn)換的用法。使用運(yùn)算符重載可以使程序易于理解并易于對(duì)對(duì)象進(jìn)行操作。幾乎所有的C++運(yùn)算符都可以被重載。如果在類(lèi)中沒(méi)有說(shuō)明本身的拷貝構(gòu)造函數(shù)和賦值運(yùn)算符,編譯程序?qū)?huì)提供,但它們都只是對(duì)對(duì)象進(jìn)行成員淺拷貝。this指

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論