版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 第11章 友元與運(yùn)算符重載目的與要求11.1 友元函數(shù)11.2 運(yùn)算符重載11.3 多態(tài)性與虛函數(shù)11.4 類(lèi)與對(duì)象的特性本章小結(jié)目的與要求 通過(guò)本章的學(xué)習(xí),應(yīng)理解友元的概念,掌握將普通函數(shù)定義為類(lèi)友元函數(shù)的方法。理解運(yùn)算符重載的概念,掌握運(yùn)算符重載函數(shù)的定義方法、調(diào)用過(guò)程及實(shí)際應(yīng)用。掌握多態(tài)性技術(shù)的概念及實(shí)現(xiàn)方法。了解虛函數(shù)與純虛函數(shù)的概念、定義格式及使用方法。11.1 友元函數(shù) 友元函數(shù)定義:友元函數(shù)是能在類(lèi)外訪問(wèn)類(lèi)中的任何成員的函數(shù)。 友元函數(shù)可以是普通函數(shù),也可以是某個(gè)類(lèi)的成員函數(shù),甚至可以將某個(gè)類(lèi)說(shuō)明成另一個(gè)類(lèi)的友元。 11.1.1 定義普通函數(shù)為友元函數(shù) 在定義一個(gè)類(lèi)時(shí),若在類(lèi)中
2、用關(guān)鍵詞friend修飾普通函數(shù),則該普通函數(shù)就成為該類(lèi)的友元函數(shù),它可以訪問(wèn)該類(lèi)中所有的成員。 定義普通友元函數(shù)的格式為: friend (形參表); 【例11.1】用友元函數(shù)的方法求長(zhǎng)方體的體積。例程友元函數(shù)的說(shuō)明:(1)友元函數(shù)不是類(lèi)的成員函數(shù),它不帶this指針。所以必須用對(duì)象或?qū)ο蟮囊米鳛橛言瘮?shù)的形參,并在函數(shù)體內(nèi)使用運(yùn)算符“.”來(lái)訪問(wèn)對(duì)象的成員(2)友元函數(shù)必須在類(lèi)內(nèi)進(jìn)行函數(shù)原型說(shuō)明,函數(shù)定義部分寫(xiě)在類(lèi)外。(3)友元函數(shù)與一般函數(shù)的區(qū)別: 友元函數(shù)可訪問(wèn)類(lèi)內(nèi)的任一數(shù)據(jù)成員或成員函數(shù); 一般函數(shù)只能訪問(wèn)類(lèi)的公有數(shù)據(jù)成員或公有成員函數(shù)。(4)由于友元函數(shù)不是類(lèi)的成員函數(shù),所以類(lèi)的訪
3、問(wèn)權(quán)限對(duì)友元函數(shù)不起作用。 (5)友元函數(shù)可使用類(lèi)內(nèi)的所有成員,破壞了數(shù)據(jù)的安全性,使用友元函數(shù)必須謹(jǐn)慎。 11.1.2 友元注意事項(xiàng)(1)友元關(guān)系是不傳遞的(2)友元關(guān)系不具有交換性(3)友元關(guān)系是不能繼承的 11.2 運(yùn)算符重載11.2.1 運(yùn)算符重載的概念 1引例 用“+”運(yùn)算符完成兩個(gè)實(shí)數(shù)、兩個(gè)復(fù)數(shù)、兩個(gè)字符串的相關(guān)運(yùn)算。(1)實(shí)數(shù)。設(shè):c1=10 ,c2=20,則:c1+c2=10+20=30。(2)復(fù)數(shù)。設(shè):c1=10+10i,c2=20+20i,則: c1+c2=30+30i 。(3)字符串。設(shè):c1=“ABCD”,c2=“EFGH” ,則c1+c2=ABCDEFGH“ 這就是“
4、+”運(yùn)算符的重載。運(yùn)算符重載的概念2運(yùn)算符重載 所謂運(yùn)算符重載就是用同一個(gè)運(yùn)算符完成不同的運(yùn)算操作。 3運(yùn)算符重載函數(shù) 運(yùn)算符重載是通過(guò)運(yùn)算符重載函數(shù)來(lái)完成的。 運(yùn)算符重載函數(shù)分一元運(yùn)算符重載函數(shù)為友元函數(shù)、一元運(yùn)算符重載函數(shù)為成員函數(shù)、二元運(yùn)算符重載函數(shù)為友元函數(shù)、二元運(yùn)算符重載函數(shù)為成員函數(shù)四種情況。11.2.2 二元運(yùn)算符重載 1.運(yùn)算符重載函數(shù)為友元函數(shù)(1)重載函數(shù)的定義格式 (形參1,形參2) 函數(shù)體 其中,重載函數(shù)名為,形參1與形參2常為參加運(yùn)算的兩個(gè)對(duì)象的引用。 當(dāng)重載函數(shù)為友元普通函數(shù)時(shí),該重載函數(shù)不能用對(duì)象調(diào)用,因此參加運(yùn)算的兩個(gè)對(duì)象必須以形參方式傳送到重載函數(shù)體內(nèi),所以形
5、參通常為兩個(gè)參加運(yùn)算的對(duì)象。運(yùn)算符重載函數(shù)為友元函數(shù)(2)重載函數(shù)的調(diào)用格式 (實(shí)參1,實(shí)參2); 其中實(shí)參1,實(shí)參2分別是重載運(yùn)算符的左操作數(shù)和右操作數(shù)。 注意,在進(jìn)行兩個(gè)對(duì)象的二元運(yùn)算時(shí),其程序中所用到的語(yǔ)法格式為: ; 如c1+c2。 而執(zhí)行上述語(yǔ)句時(shí),系統(tǒng)將自動(dòng)轉(zhuǎn)換成對(duì)重載函數(shù)的調(diào)用格式: (左操作數(shù),右操作數(shù)); 如operator+(c1,c2); 【例11.2】定義一個(gè)復(fù)數(shù)類(lèi) ,用友元函數(shù)重載“+”運(yùn)算符,使這個(gè)運(yùn)算符能直接完成兩個(gè)復(fù)數(shù)的加法運(yùn)算,以及一個(gè)復(fù)數(shù)與一個(gè)實(shí)數(shù)的加法運(yùn)算。 例程運(yùn)算符重載函數(shù)為類(lèi)的友元函數(shù)說(shuō)明(3)對(duì)于運(yùn)算符重載,必須說(shuō)明以下幾點(diǎn): 運(yùn)算符重載函數(shù)名必須
6、為:operator 運(yùn)算符的重載是通過(guò)調(diào)用運(yùn)算符重載函數(shù)實(shí)現(xiàn)的。調(diào)用函數(shù)時(shí),左操作數(shù)為重載函數(shù)的第一個(gè)實(shí)參,右操作數(shù)作為函數(shù)的第二個(gè)實(shí)參。 形參說(shuō)明。若重載函數(shù)為友元函數(shù),則參數(shù)通常為兩個(gè),即左操作數(shù)和右操作數(shù)。 運(yùn)算符重載函數(shù)的返回類(lèi)型。若二個(gè)同類(lèi)對(duì)象進(jìn)行二元運(yùn)算后的結(jié)果類(lèi)型仍為原類(lèi)型,則運(yùn)算符重載函數(shù)的返回類(lèi)型應(yīng)為原類(lèi)型。 C+中允許重載的運(yùn)算符(4)C+中允許重載的運(yùn)算符如下表所示。+*/%&|!,=+= =!=&|+= =*=/=%=&=! = ( ) * newdeleteC+中不允許重載的運(yùn)算符運(yùn)算符運(yùn)算符的含義不允許重載的原因?:三目運(yùn)算符 在C+中沒(méi)有
7、定義一個(gè)三目運(yùn)算符的語(yǔ)法 成員操作符為保證成員操作符對(duì)成員訪問(wèn)的安全性,故不允許重載*成員指針操作符同上:作用域運(yùn)算符因該操作符左邊的操作數(shù)是一個(gè)類(lèi)型名,而不是一個(gè)表達(dá)式sizeof 求字節(jié)數(shù)操作符其操作數(shù)是一個(gè)類(lèi)型名,而不是一個(gè)表達(dá)式(5)C+中不允許重載的運(yùn)算符如下表所示。 2.運(yùn)算符重載函數(shù)為類(lèi)的成員函數(shù)(1)重載函數(shù)的定義格式 :(形參) 函數(shù)體 其中,類(lèi)型為重載函數(shù)的返回類(lèi)型。 類(lèi)名為成員函數(shù)所屬類(lèi)的類(lèi)名。 operator為重載函數(shù)名,即:=。 形參常為參加運(yùn)算的對(duì)象或數(shù)據(jù)。運(yùn)算符重載函數(shù)為類(lèi)的成員函數(shù) (2)重載函數(shù)的調(diào)用格式 .(實(shí)參表); 注意:在進(jìn)行兩個(gè)對(duì)象的二元運(yùn)算時(shí),其
8、程序中所用到語(yǔ)法格式為: ; 如:c1+c2 而執(zhí)行上述語(yǔ)句時(shí),系統(tǒng)將自動(dòng)轉(zhuǎn)換成對(duì)重載函數(shù)的調(diào)用格式: .(右操作數(shù)); 如c1.operator+(c2); 【例11.3】用成員運(yùn)算符重載函數(shù)實(shí)現(xiàn)例11.2中復(fù)數(shù)的加法運(yùn)算。 例程成員函數(shù)與友元函數(shù)作為重載函數(shù)的差別(3)成員函數(shù)與友元函數(shù)作為重載函數(shù)的差別: 用成員函數(shù)與友元函數(shù)作為運(yùn)算符重載函數(shù),就運(yùn)算符的使用來(lái)講是一樣,但編譯器處理方法是不同的。 當(dāng)重載函數(shù)為成員函數(shù)時(shí),二元運(yùn)算符的左操作數(shù)為調(diào)用重載函數(shù)的對(duì)象。右操作數(shù)為實(shí)參。當(dāng)重載函數(shù)為友元函數(shù)時(shí),二元運(yùn)算符的左操作數(shù)為調(diào)用重載函數(shù)的第一個(gè)實(shí)參。右操作數(shù)為第二個(gè)實(shí)參。 11.2.3
9、一元運(yùn)算符重載 1.一元運(yùn)算符重載函數(shù)為友元函數(shù)(1)重載函數(shù)定義格式 operator (形參) 函數(shù)體 對(duì)典型一元運(yùn)算符“+”分前置與后置進(jìn)行討論。 前置“+”運(yùn)算符重載函數(shù)定義格式: operator+ ( 類(lèi)名 & ) 函數(shù)體 后置“+”運(yùn)算符重載函數(shù)定義格式: operator + ( 類(lèi)名 & ,int ) 函數(shù)體 其中,int 只是用于區(qū)分是前置還是后置運(yùn)算符,并無(wú)實(shí)際意義。一元運(yùn)算符重載函數(shù)為友元函數(shù) (2)重載函數(shù)調(diào)用格式前置“+”運(yùn)算符重載函數(shù)調(diào)用格式: operator +();后置“+”運(yùn)算符重載函數(shù)的調(diào)用格式: operator +(,1);【例11.
10、4】定義一個(gè)描述時(shí)間計(jì)數(shù)器的類(lèi),其三個(gè)數(shù)據(jù)成員分別用于存放:時(shí)、分和秒。用友元函數(shù)重載“+”運(yùn)算符,實(shí)現(xiàn)計(jì)數(shù)器對(duì)象的加1運(yùn)算。 例程2.一元運(yùn)算符重載函數(shù)為成員函數(shù)(1)重載函數(shù)的定義格式: :operator (形參) 函數(shù)體對(duì)典型一元運(yùn)算符“+”分前置與后置進(jìn)行討論。 “+”為前置運(yùn)算符,重載函數(shù)定義格式: :operator +( ) 函數(shù)體 “+”為后置運(yùn)算符,重載函數(shù)定義格式: :operator +( int ) 函數(shù)體一元運(yùn)算符重載函數(shù)為成員函數(shù)(2)重載函數(shù)的調(diào)用格式 前置“+”運(yùn)算符,重載函數(shù)調(diào)用格式: .operator +( ); 后置“+”運(yùn)算符,重載函數(shù)調(diào)用格式: .
11、operator +(1); 【例11.5】定義一個(gè)描述時(shí)間計(jì)數(shù)器的類(lèi),其三個(gè)數(shù)據(jù)成員分別用于存放:時(shí)、分和秒。用成員函數(shù)重載“+”運(yùn)算符,實(shí)現(xiàn)計(jì)數(shù)器對(duì)象的加1運(yùn)算。例程11.2.4 字符串類(lèi)運(yùn)算符重載 舉例說(shuō)明字符串運(yùn)算符重載函數(shù)的定義與調(diào)用方法,及重載后字符串運(yùn)算符的使用方法。 【例11.6】編寫(xiě)字符串運(yùn)算符“”的重載函數(shù),使運(yùn)算符“”能完成兩個(gè)字符串的比較運(yùn)算,實(shí)現(xiàn)字符串直接比較。分別用成員函數(shù)與友元函數(shù)編寫(xiě)重載函數(shù)。 例程11.3 多態(tài)性與虛函數(shù)11.3.1 多態(tài)性技術(shù)1.多態(tài)性技術(shù)的概念 (1)多態(tài)性技術(shù):調(diào)用同名函數(shù)完成不同的函數(shù)功能,或使用同名運(yùn)算符完成不同的運(yùn)算功能。 (2)多
12、態(tài)性常用重載技術(shù)與虛函數(shù)來(lái)實(shí)現(xiàn)。 (3)多態(tài)性分為兩類(lèi):編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。 多態(tài)性技術(shù)2編譯時(shí)的多態(tài)性 通過(guò)函數(shù)的重載或運(yùn)算符的重載來(lái)實(shí)現(xiàn)的。也稱(chēng)靜態(tài)多態(tài)性。 3運(yùn)行時(shí)的多態(tài)性 運(yùn)行時(shí)的多態(tài)性也稱(chēng)為動(dòng)態(tài)多態(tài)性,運(yùn)行時(shí)的多態(tài)性是指在程序執(zhí)行前,根據(jù)函數(shù)名和參數(shù)無(wú)法確定應(yīng)該調(diào)用哪一個(gè)函數(shù),必須在程序執(zhí)行過(guò)程中,根據(jù)具體執(zhí)行情況來(lái)動(dòng)態(tài)地確定。 運(yùn)行時(shí)的多態(tài)性是通過(guò)類(lèi)的繼承關(guān)系和虛函數(shù)來(lái)實(shí)現(xiàn)的。11.3.2 虛函數(shù)1虛函數(shù)概念 在基類(lèi)中用關(guān)鍵字 virtual修飾的成員函數(shù)稱(chēng)為虛函數(shù)。2虛函數(shù)定義格式 virtual (參數(shù)) 函數(shù)體3用虛函數(shù)實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性的方法(1)在基類(lèi)中定義虛函數(shù)
13、(2)在派生類(lèi)中定義與基類(lèi)虛函數(shù)同名、同參數(shù)、同返回類(lèi)型的成員函數(shù),即派生類(lèi)中的虛函數(shù)。(3)在主函數(shù)中操作步驟: 用基類(lèi)定義指針變量。 將基類(lèi)對(duì)象地址或派生類(lèi)對(duì)象地址賦給該指針變量。 用 (實(shí)參);方式去調(diào)用基類(lèi)或派生類(lèi)中的虛函數(shù)。用虛函數(shù)實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性舉例 【例11.7】定義基類(lèi)High,數(shù)據(jù)成員為高H,定義成員函數(shù)Show()為虛函數(shù)。然后再由High派生出長(zhǎng)方體類(lèi)Cuboid與圓柱體類(lèi)Cylinder。并在兩個(gè)派生類(lèi)中定義成員函數(shù)Show()為虛函數(shù)。在主函數(shù)中,用基類(lèi)High定義指針變量p,然后用指針p動(dòng)態(tài)調(diào)用基類(lèi)與派生類(lèi)中虛函數(shù)Show(),顯示長(zhǎng)方體與圓柱體的體積。 關(guān)于虛函數(shù)有
14、幾點(diǎn)說(shuō)明: (1)派生類(lèi)虛函數(shù)必須與基類(lèi)虛函數(shù)同名、同參數(shù)、同返回類(lèi)型。 (2)實(shí)現(xiàn)動(dòng)態(tài)的多態(tài)性時(shí),必須使用基類(lèi)類(lèi)型的指針變量,使該指針指向不同派生類(lèi)的對(duì)象,并通過(guò)調(diào)用指針?biāo)赶虻奶摵瘮?shù)才能實(shí)現(xiàn)動(dòng)態(tài)的多態(tài)性。例程虛函數(shù)的說(shuō)明(3)虛函數(shù)必須是類(lèi)的一個(gè)成員函數(shù),不能是友元函數(shù),也不能是靜態(tài)的成員函數(shù)。(4)若派生類(lèi)中沒(méi)有定義虛函數(shù),將派生類(lèi)對(duì)象地址賦給基類(lèi)定義的指針變量后,用指針變量虛函數(shù)(實(shí)參);方式去調(diào)用虛函數(shù)時(shí),調(diào)用的虛函數(shù)是基類(lèi)的虛函數(shù)。 (5)可將析構(gòu)函數(shù)定義為虛函數(shù),但不能將構(gòu)造函數(shù)定義為虛函數(shù)。(6)虛函數(shù)與一般函數(shù)相比較,調(diào)用時(shí)執(zhí)行速度要慢一些。為了實(shí)現(xiàn)多態(tài)性。在每一個(gè)派生類(lèi)中均
15、要保持相應(yīng)虛函數(shù)的入口地址表,函數(shù)調(diào)用機(jī)制也是間接實(shí)現(xiàn)的。11.3.3 純虛函數(shù) 1.純虛函數(shù)的概念 在定義一個(gè)基類(lèi)時(shí),若無(wú)法定義基類(lèi)中虛函數(shù)的具體操作,虛函數(shù)的具體操作完全取決于其不同的派生類(lèi)。這時(shí),可將基類(lèi)中的虛函數(shù)定義為純虛函數(shù)。 2.純虛函數(shù)定義格式: virtual (形參表)=0; 3.純虛函數(shù)特點(diǎn):(1)純虛函數(shù)無(wú)函數(shù)體,在派生類(lèi)中沒(méi)有重新定義純虛函數(shù)之前,不能調(diào)用該函數(shù)。(2)將函數(shù)名賦值為0的含義是,將指向函數(shù)體的指針值賦初值0。純虛函數(shù)特點(diǎn)(3)將至少包含一個(gè)純虛函數(shù)的類(lèi)稱(chēng)為抽象類(lèi)。這種類(lèi)只能作為派生類(lèi)的基類(lèi),不能用來(lái)說(shuō)明對(duì)象。 【例11.8】定義抽象基類(lèi)High,數(shù)據(jù)成員
16、為高H,定義Show()為純虛函數(shù)。然后再由High派生出長(zhǎng)方體類(lèi)Cuboid與圓柱體類(lèi)Cylinder。并在兩個(gè)派生類(lèi)中重新定義虛函數(shù)Show()。在主函數(shù)中,用基類(lèi)High定義指針變量p,然后用指針p動(dòng)態(tài)調(diào)用派生類(lèi)中虛函數(shù)Show(),顯示長(zhǎng)方體與圓柱體的體積。(4)在以抽象類(lèi)作為基類(lèi)的派生類(lèi)中必須有純虛函數(shù)的實(shí)現(xiàn)部分,即必須有重載純虛函數(shù)的函數(shù)體。否則,這樣的派生類(lèi)也是不能產(chǎn)生對(duì)象的。 例程11.4 類(lèi)與對(duì)象的特性1.封裝性2.派生與繼承性3.多態(tài)性4.對(duì)象的消息機(jī)制本章小結(jié)1.友元 為了能在類(lèi)外直接使用類(lèi)的私有成員或保護(hù)成員,C+提供了友元。將普通函數(shù)定義為某類(lèi)的友元函數(shù)的方法,是在該
17、類(lèi)中增加用freind修飾的普通函數(shù)原型說(shuō)明: friend (形參); 此時(shí),可在 中使用類(lèi)的私有成員或保護(hù)成員。2.運(yùn)算符重載 運(yùn)算符重載是指用同一運(yùn)算符完成不同的運(yùn)算操作。 運(yùn)算符重載是通過(guò)運(yùn)算符重載函數(shù)來(lái)實(shí)現(xiàn)的。 運(yùn)算符重載函數(shù)分為一元運(yùn)算符重載函數(shù)和二元運(yùn)算符重載函數(shù)。 運(yùn)算符重載函數(shù)可通過(guò)成員函數(shù)或友元函數(shù)來(lái)實(shí)現(xiàn)。 (1)二元運(yùn)算符重載函數(shù) 用友元函數(shù)重載運(yùn)算符 重載函數(shù)作為普通友元函數(shù)一般應(yīng)寫(xiě)在類(lèi)外。在類(lèi)中作引用性說(shuō)明: friend (形參1,形參2) 函數(shù)體 在執(zhí)行運(yùn)算符操作時(shí),編譯器將對(duì)運(yùn)算符的操作解釋為對(duì)運(yùn)算符友元重載函數(shù)的調(diào)用,并將運(yùn)算符左、右操作數(shù)作為調(diào)用友元重載函數(shù)
18、的實(shí)參。即友元重載函數(shù)的調(diào)用形式為: (左操作對(duì)象,右操作對(duì)象); 二元運(yùn)算符重載函數(shù)用成員函數(shù)重載運(yùn)算符: :(形參) 函數(shù)體 在執(zhí)行運(yùn)算符操作時(shí),編譯器將對(duì)運(yùn)算符的操作解釋為對(duì)運(yùn)算符成員重載函數(shù)的調(diào)用,并將運(yùn)算符左操作數(shù)作為調(diào)用重載函數(shù)的對(duì)象,右操作數(shù)作為重載函數(shù)的實(shí)參。即重載成員函數(shù)的調(diào)用形式為: .(右操作數(shù)); (2)一元運(yùn)算符重載函數(shù) 用成員函數(shù)重載“+”運(yùn)算符前置+::()后置+::(int)用友元函數(shù)重載“+”運(yùn)算符前置+:friend ( 類(lèi)名 &)后置+:friend (類(lèi)名&,int) 其中形參中的int 只用于區(qū)別前置+重載函數(shù),還是后置+重載函數(shù),并無(wú)
19、整型參數(shù)的含義。對(duì)于前置+成員函數(shù),必須用this指針?lè)祷刈约咏Y(jié)果。 (3)字符串運(yùn)算符重載函數(shù) 使用字符串運(yùn)算符重載函數(shù),可使字符串拷貝、拼接、比較等操作直接用字符串運(yùn)算符“=”、“+”、“”、“”來(lái)進(jìn)行。字符串常進(jìn)行二元運(yùn)算,其重載函數(shù)的定義格式與二元運(yùn)算符重載函數(shù)相同。3.多態(tài)性技術(shù) 多態(tài)性技術(shù)是指調(diào)用同名函數(shù)完成不同的函數(shù)功能,或使用同名運(yùn)算符完成不同的運(yùn)算功能。它常用重載函數(shù)與虛函數(shù)來(lái)實(shí)現(xiàn)。 函數(shù)重載或運(yùn)算符重載均屬于編譯時(shí)的多態(tài)性,而虛函數(shù)則屬于運(yùn)行時(shí)的多態(tài)性。 4.虛函數(shù) 在基類(lèi)中用關(guān)鍵字 virtual修飾的成員函數(shù)稱(chēng)為虛函數(shù),定義格式為: virtual (參數(shù)) 函數(shù)體 用
20、虛函數(shù)實(shí)現(xiàn)“運(yùn)行時(shí)的多態(tài)性”的方法是:在派生類(lèi)中定義與基類(lèi)虛函數(shù)同名、同參數(shù)、同返回類(lèi)型的虛函數(shù),用基類(lèi)定義指針變量p,將基類(lèi)或派生類(lèi)對(duì)象的地址賦給p(即p=&對(duì)象)后,用p-虛函數(shù),則可實(shí)現(xiàn)“運(yùn)行時(shí)的多態(tài)性”。 5.純虛函數(shù) 將函數(shù)名賦0值且無(wú)函數(shù)體的虛函數(shù)稱(chēng)為純虛函數(shù),定義格式為: virtual (參數(shù))=0; 含有純虛函數(shù)的類(lèi)稱(chēng)為抽象類(lèi),不能用抽象類(lèi)定義對(duì)象。因?yàn)榧兲摵瘮?shù)無(wú)函數(shù)體,所以純虛函數(shù)不能調(diào)用,因此必須在派生類(lèi)中重新定義虛函數(shù)。 6本章重點(diǎn)和難點(diǎn)重點(diǎn)重點(diǎn):友元、運(yùn)算符重載與多態(tài)性技術(shù)的概念,友元函數(shù)的定義方法,運(yùn)算符重載函數(shù)的定義與使用方式。難點(diǎn):難點(diǎn):運(yùn)算符重載的調(diào)用
21、過(guò)程,虛函數(shù)的概念、定義格式及使用方法。例11.1# include class Cuboid private: float Length,Width,High; public: Cuboid(float l,float w,float h) /構(gòu)造函數(shù) Length=l;Width=w; High=h; friend float Volume(Cuboid &); /將普通函數(shù)定義為友元函數(shù); /以便使用類(lèi)中私有數(shù)據(jù) float Volume(Cuboid &c) /求體積的普通函數(shù) return c.Length*c.Width*c.High;void main (void
22、) Cuboid c(10,20,30); /定義對(duì)象c,并初始化 cout長(zhǎng)方體積=Volume(c)endl; /調(diào)用友元函數(shù)求體積返回返回例11.2(1)# include class Complex private: float Real,Image; public: Complex(float r=0,float i=0) Real=r;Image=i; void Show(int i) coutci= Real+Imageiendl; friend Complex operator + (Complex & ,Complex &); /“+”重載函數(shù)為友元函數(shù) fr
23、iend Complex operator + (Complex &,float); ; 例11.2(2)Complex operator + (Complex &c1, Complex &c2)/普通函數(shù) Complex t; t.Real=c1.Real+c2.Real; t.Image=c1.Image+c2.Image; return t; Complex operator + (Complex &c,float s) Complex t; t.Real=c.Real+s; t.Image=c.Image; return t; 例11.2(3)void
24、main(void) Complex c1(25,50),c2(100,200),c3; c1.Show(1); c2.Show(2); c3=c1+c2; /c3=(25+50i)+(100+200i)=125+250i c3.Show(3); c1=c1+200; /c1=25+50i+200=225+50i c1.Show(1); 返回返回例11.3(1)# include class Complex private: float Real,Image; public: Complex(float r=0,float i=0) Real=r;Image=i; void Show(int
25、i) coutci= Real+Imageiendl; Complex operator + (Complex &); Complex operator + (float); ; Complex Complex:operator + (Complex &c) Complex t; t.Real=Real+c1.Real; t.Image=Image+c1.Image; return t; 例11.3(2) Complex Complex :operator + (float s) Complex t; t.Real=Real+s; t.Image=Image; return t
26、; void main(void) Complex c1(25,50),c2(100,200),c3; c1.Show(1); c2.Show(2); c3=c1+c2; /c3=(25+50i)+(100+200i)=125+250i c3.Show(3); c1=c1+200; /c1=25+50i+200=225+50i c1.Show(1); 返回返回例11.4(1)# include class TCount private: int Hour,Minute,Second; public: TCount() Hour=Minute=Second=0; TCount (int h,in
27、t m,int s) Hour=h;Minute=m;Second=s; friend TCount &operator +(TCount &t ); /“前置+”運(yùn)算符重載友元函數(shù) friend TCount operator +( TCount &t ,int ); /“后置+”運(yùn)算符重載友元函數(shù) void Show(int i ) coutti=Hour:Minute:Secondendl;例11.4(2)TCount &operator + (TCount & t) /定義“前置+”重載友元函數(shù) t.Second+; /計(jì)數(shù)器對(duì)象t的秒加1 if
28、 (t.Second=60) /秒單元滿(mǎn)60,清0,分單元加1 t.Second=0; t.Minute+; if (t.Minute=60) /分單元滿(mǎn)60,清0,時(shí)單元加1 t.Minute=0; t.Hour+; if (t.Hour=24) /時(shí)單元滿(mǎn)24,清0 t.Hour=0; return t; /返回自加后的對(duì)象t例11.4(3)TCount operator+ (TCount & t,int ) /定義“后置+”重載友元函數(shù) TCount temp=t;/用臨時(shí)對(duì)象temp存放加1前的t值 t.Second+;/對(duì)秒、分、時(shí)單元的加1操作 if (t.Second=6
29、0) t.Second=0; t.Minute+; if (t.Minute=60) t.Minute=0; t.Hour+; if (t.Hour=24) t.Hour=0; return temp;/返回加1前的t值例11.4(4)void main(void) TCount t1(10,25,50),t2,t3; /t1=10:25:50 t1.Show(1); t2=+t1; /先加后用 t1.Show(1); t2.Show(2); t3=t1+; /先用后加 t1.Show(1); t3.Show(3); 返回返回例11.5(1)# include class TCount /定義
30、計(jì)數(shù)器類(lèi)TCount private: int Hour,Minute,Second;/數(shù)據(jù)成員時(shí)、分、秒 public: TCount (int h=0,int m=0,int s=0)/定義默認(rèn)值為0的構(gòu)造函數(shù) Hour=h;Minute=m;Second=s; TCount operator +( );/定義“前置+”運(yùn)算符重載成員函數(shù) TCount operator +( int ); /定義“后置+”運(yùn)算符重載成員函數(shù) void Show(int i ) /定義顯示時(shí):分:秒的成員函數(shù) coutti=Hour:Minute:Secondendl;例11.5(2)TCount TCou
31、nt :operator + () /定義“前置+”運(yùn)算符重載函數(shù)(無(wú)形參) Second+;/秒單元加1 if (Second=60) /秒單元滿(mǎn)60,清0后,分單元加1 Second=0; Minute+; if (Minute=60)/分單元滿(mǎn)60后,清0后,時(shí)單元加1 Minute=0; Hour+; if (Hour=24)/時(shí)單元滿(mǎn)24,清0 Hour=0; return *this;例11.5(3)TCount TCount:operator+ (int ) /定義“后置+”運(yùn)算符重載函數(shù)(有int) TCount temp=*this; Second+; if (Second=
32、60) Second=0; Minute+; if (Minute=60) Minute=0; Hour+; if (Hour=24) Hour=0; return temp;例11.5(4)void main(void) TCount t1(10,25,50),t2,t3; /定義時(shí)間計(jì)數(shù)器對(duì)象t1=10:25:50 t1.Show(1); t2=+t1; /先加后用,即:先將t1自加,然后將t1賦給t2 t1.Show(1); t2.Show(2); t3=t1+; /先用后加,即:先將t1賦給t3,然后將t1自加 t1.Show(1); t3.Show(3);返回返回例11.6(1)#
33、include # include class String/定義字符串類(lèi) private: int Length; char *Sp; public: String(char *s) /定義有參構(gòu)造函數(shù) Length=strlen(s); Sp=new charLength +1; strcpy(Sp,s); 例11.6(2)String() /定義析構(gòu)函數(shù) if (Sp) delete Sp; void Show() /定義顯示字符串函數(shù) coutSp(String &s) if (strcmp(Sp,s.Sp)0) return 1; else return 0; ;例11.6(3)void main (void) String s1(software),s2(hardware); s1.Show(); s2.Show(); if (s1s2) couts2endl; else couts1s2endl;返回返回例11.7(1)# include class High protected: float H; public: High(float h) H=h; virtual void Show()/在基類(lèi)中定義虛函數(shù)Show()
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- S-3-Keto-sphinganine-d18-0-hydrochloride-生命科學(xué)試劑-MCE-1677
- CP-LC-0729-生命科學(xué)試劑-MCE-3226
- Actinobolin-plus-Actinobolin-生命科學(xué)試劑-MCE-7644
- 3-4-Methylenedioxy-pyrovalerone-metabolite-2-hydrochloride-生命科學(xué)試劑-MCE-1172
- 2025年度國(guó)際貿(mào)易違約風(fēng)險(xiǎn)預(yù)防與處理合同
- 2025年度范文正式版合同文員崗位職責(zé)規(guī)范與職業(yè)素養(yǎng)培養(yǎng)協(xié)議
- 二零二五年度2025年競(jìng)業(yè)禁止及保密協(xié)議模板
- 2025年度風(fēng)力發(fā)電場(chǎng)租賃定金協(xié)議模板
- 2025年度籃球聯(lián)賽裁判員免責(zé)聲明及賽事執(zhí)行合同
- 二零二五年度自媒體合伙人合同版:自媒體平臺(tái)內(nèi)容創(chuàng)作與推廣合同
- 小兒肺炎治療與護(hù)理
- 《高處作業(yè)安全》課件
- 春節(jié)后收心安全培訓(xùn)
- 小學(xué)教師法制培訓(xùn)課件
- 電梯操作證及電梯維修人員資格(特種作業(yè))考試題及答案
- 市政綠化養(yǎng)護(hù)及市政設(shè)施養(yǎng)護(hù)服務(wù)方案(技術(shù)方案)
- SLT824-2024 水利工程建設(shè)項(xiàng)目文件收集與歸檔規(guī)范
- 鍋爐本體安裝單位工程驗(yàn)收表格
- 我國(guó)水體中抗生素的污染現(xiàn)狀、危害及防治建議
- 手術(shù)出血量的評(píng)估
- 報(bào)價(jià)單(產(chǎn)品報(bào)價(jià)單)
評(píng)論
0/150
提交評(píng)論