第五章成員函數(shù)_第1頁(yè)
第五章成員函數(shù)_第2頁(yè)
第五章成員函數(shù)_第3頁(yè)
第五章成員函數(shù)_第4頁(yè)
第五章成員函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩79頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第五章成員函數(shù)第一頁(yè),共八十四頁(yè),編輯于2023年,星期四5.1成員函數(shù)的概念

為了實(shí)現(xiàn)對(duì)象的行為,我們把一些相關(guān)的語(yǔ)句組織在一起,并給它們注明相應(yīng)的名稱(chēng),形成一些相對(duì)獨(dú)立而且便于管理和閱讀的小塊程序,每個(gè)小程序塊描述了一個(gè)完整的行為,這種形式的組合就構(gòu)成了成員函數(shù)。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二頁(yè),共八十四頁(yè),編輯于2023年,星期四5.2算法描述

5.2.1算法的概念

一個(gè)完整的對(duì)象應(yīng)該包括兩個(gè)方面的內(nèi)容,即對(duì)數(shù)據(jù)的描述(對(duì)象屬性)和對(duì)操作的描述(對(duì)象行為)。對(duì)操作的描述也就是算法,是設(shè)計(jì)和實(shí)現(xiàn)對(duì)象行為的靈魂。一個(gè)完整的算法應(yīng)該具有以下5個(gè)特性:有窮性、確定性、有效性、輸入性和輸出性。

面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三頁(yè),共八十四頁(yè),編輯于2023年,星期四5.2.2算法的表示

為了表示一個(gè)算法,可以采用多種形式。最常見(jiàn)的幾種方法有自然語(yǔ)言表示法、流程圖表示法、偽代碼表示法和計(jì)算機(jī)語(yǔ)言表示法。自然語(yǔ)言表示法:自然語(yǔ)言表示法就是用我們?nèi)粘I钪械恼Z(yǔ)言來(lái)表示算法的實(shí)現(xiàn)過(guò)程,對(duì)采用何種語(yǔ)言沒(méi)有限制。但是采用自然語(yǔ)言表示往往不太嚴(yán)格,容易造成歧義。另外,用這種方法描述包含分支和循環(huán)的算法不太方便。因此,自然語(yǔ)言表示法很少用來(lái)描述復(fù)雜的算法。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四頁(yè),共八十四頁(yè),編輯于2023年,星期四面向?qū)ο蟪绦蛟O(shè)計(jì)第二版圖5.1一般流程圖表示算法流程圖表示法:流程圖就是用一些圖框表示各種操作。用流程圖來(lái)表示算法最大的優(yōu)點(diǎn)就是直觀形象,便于理解,并且實(shí)用性強(qiáng),能夠方便的表示包含分支和循環(huán)的結(jié)構(gòu),避免了用自然語(yǔ)言表示算法的不足。第五頁(yè),共八十四頁(yè),編輯于2023年,星期四面向?qū)ο蟪绦蛟O(shè)計(jì)第二版圖5.2N-S流程圖表示算法第六頁(yè),共八十四頁(yè),編輯于2023年,星期四偽代碼表示法:偽代碼是用介于自然語(yǔ)言和計(jì)算機(jī)語(yǔ)言之間的文字和符號(hào)來(lái)描述算法。從結(jié)構(gòu)上看,偽代碼表示法類(lèi)似于最終的計(jì)算機(jī)語(yǔ)言,每一行就表示一個(gè)基本的操作。它不用圖形符號(hào),因此書(shū)寫(xiě)方便、格式緊湊,也易于理解,便于向最終的程序過(guò)渡。偽代碼表示法書(shū)寫(xiě)格式比較自由,容易直觀表達(dá)出設(shè)計(jì)者的思想。同時(shí),書(shū)寫(xiě)的算法也容易修改,很容易寫(xiě)出結(jié)構(gòu)化的算法。因此,這種方法一般被專(zhuān)業(yè)的軟件開(kāi)發(fā)人員采用,特別是在詳細(xì)設(shè)計(jì)中采用偽代碼表示法,可以使以后的編碼階段變得簡(jiǎn)單。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第七頁(yè),共八十四頁(yè),編輯于2023年,星期四計(jì)算機(jī)語(yǔ)言表示法: 一個(gè)算法要拿到計(jì)算機(jī)上去運(yùn)行,最終還是得采用計(jì)算機(jī)語(yǔ)言表示。計(jì)算機(jī)是無(wú)法識(shí)別流程圖和偽代碼的。只有嚴(yán)格按照計(jì)算機(jī)語(yǔ)言語(yǔ)法編寫(xiě)的程序才能被計(jì)算機(jī)執(zhí)行。目前使用的計(jì)算機(jī)語(yǔ)言多種多樣,本書(shū)所介紹的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言(C++)就是種很好的描述和實(shí)現(xiàn)算法的工具。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第八頁(yè),共八十四頁(yè),編輯于2023年,星期四5.3成員函數(shù)的定義與調(diào)用

5.3.1成員函數(shù)的定義面向?qū)ο蟪绦蛟O(shè)計(jì)第二版定義一個(gè)成員函數(shù)必須具備四個(gè)條件:⑴函數(shù)必須具有返回值類(lèi)型,即函數(shù)必須有返回值,且該返回值的類(lèi)型應(yīng)該與函數(shù)返回值的類(lèi)型一致⑵函數(shù)必須具有一個(gè)名字,即函數(shù)名。⑶函數(shù)必須具有一個(gè)形參(形式參數(shù))列表,C++規(guī)定,形參列表以左括號(hào)“(”開(kāi)始,到右括號(hào)“)”結(jié)束,且各個(gè)形參之間用“,”分開(kāi)。⑷函數(shù)要完成一定的功能,必須具有一個(gè)函數(shù)體,其中,前面的三個(gè)條件構(gòu)成了函數(shù)的原型。第九頁(yè),共八十四頁(yè),編輯于2023年,星期四說(shuō)明一個(gè)函數(shù)原型的一般形式有兩種:函數(shù)返回值類(lèi)型函數(shù)名(參數(shù)類(lèi)型1參數(shù)名1,參數(shù)類(lèi)型2參數(shù)名2,…);函數(shù)返回值類(lèi)型函數(shù)名(參數(shù)類(lèi)型1,參數(shù)類(lèi)型2,…); 以上兩種方法均可以使用,但是為了增加程序的可讀性建議使用第一種方法。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十頁(yè),共八十四頁(yè),編輯于2023年,星期四成員函數(shù)的定義:(1)對(duì)于代碼較少的成員函數(shù)的定義,可以直接在類(lèi)中進(jìn)行。

classCircle{protected:

intRadius;

public:

fioatcircle_area(fioatpi){returnpi*Radius*Radius;}…};(2)對(duì)于代碼較多的成員函數(shù)的定義,通常只在類(lèi)中進(jìn)行原型說(shuō)明,在類(lèi)外對(duì)成員函數(shù)進(jìn)行定義。

classCircle{protected:

intRadius;

public:

fioatcircle_area(fioatpi);

…};floatCircle::circle_area(floatpi){returnpi*Radius*Radius;}請(qǐng)注意,這時(shí)的函數(shù)名應(yīng)該包含:類(lèi)名(Circle)+作用域分辨符(::)+原函數(shù)(circle_area)第十一頁(yè),共八十四頁(yè),編輯于2023年,星期四5.3.2成員函數(shù)的調(diào)用一般形式有兩種:

對(duì)象名.函數(shù)名(實(shí)參1,實(shí)參2,…); 對(duì)象指針→函數(shù)名(實(shí)參1,實(shí)參2,…);例如:voidmain(){ ┇ cout<<“Theareaofcircle=”<<mycircle.circle_area(3.14); ┇}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十二頁(yè),共八十四頁(yè),編輯于2023年,星期四關(guān)于形參和實(shí)參的說(shuō)明:

⑴在函數(shù)定義時(shí)說(shuō)明的形參,并不占內(nèi)存中的存儲(chǔ)單元。只有在函數(shù)調(diào)用時(shí),形參才被分配內(nèi)存單元,并被賦以實(shí)參的值。在調(diào)用結(jié)束后,該部分內(nèi)存立刻被釋放。⑵實(shí)參可以是常量、變量、或表達(dá)式等,但要求它們必須有確定的值。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十三頁(yè),共八十四頁(yè),編輯于2023年,星期四5.3.3.1函數(shù)指針在程序運(yùn)行中,每個(gè)函數(shù)在編譯時(shí)都會(huì)被編譯器分配給一個(gè)入口地址,則指向這個(gè)入口地址的指針就稱(chēng)為函數(shù)指針。函數(shù)代碼是程序的算法指令部分,被存放在代碼區(qū)(code),函數(shù)指針指向代碼區(qū)中某個(gè)函數(shù)的地址,因此,通過(guò)函數(shù)指針可以調(diào)用相應(yīng)的函數(shù)。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十四頁(yè),共八十四頁(yè),編輯于2023年,星期四⑴函數(shù)指針的聲明正確的指針類(lèi)型聲明如下: 返回值類(lèi)型(*函數(shù)指針名)(參數(shù)表); 例如:int(*func_p)(chara,charb);其中,“int”表示函數(shù)的返回值類(lèi)型為整型,“(*func_p)”表示func_p是一個(gè)指針,后面的(chara,charb)表示該指針(func_p)是函數(shù)指針。其定義后產(chǎn)生的指針變量有全局、靜態(tài)與局部之分,同樣占有內(nèi)存空間(與其他類(lèi)型指針變量所占空間相同)。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十五頁(yè),共八十四頁(yè),編輯于2023年,星期四由于(*func_p)所扮演的角色與函數(shù)名相同,因此在使用(*func_p)時(shí),只需將他看作函數(shù)名即可。請(qǐng)看下面一個(gè)例子,學(xué)習(xí)如何通過(guò)函數(shù)指針調(diào)用函數(shù): intfunc(int); int(*func_p)(int); func_p=func; //↑函數(shù)指針(*func_p)指向代碼區(qū)函數(shù)func()的地址 intx=func(4);//使用函數(shù)func(),這個(gè)用法很常見(jiàn) inty=(*func_p)(5); //↑使用函數(shù)指針(*func_p)實(shí)際上調(diào)用了func()函數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十六頁(yè),共八十四頁(yè),編輯于2023年,星期四⑵函數(shù)指針可以作為函數(shù)的參數(shù),如下所示:編寫(xiě)一個(gè)函數(shù),計(jì)算一個(gè)字符串的長(zhǎng)度intlen(constchar*string) { constchar*p=string; for(inti=0;*p!=‘\0’;i++) { p++; } returni;}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十七頁(yè),共八十四頁(yè),編輯于2023年,星期四通過(guò)函數(shù)指針調(diào)用上述函數(shù)intCaller(constchar*string,int(*f_p)(constchar*))//↑通過(guò)形參的形式,說(shuō)明一個(gè)函數(shù)指針int(*f_p)(constchar*){ return(*f_p)(string); //通過(guò)參數(shù)結(jié)合的形式將函數(shù) //指針指向被調(diào)用的函數(shù)intlen(constchar*string) }面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十八頁(yè),共八十四頁(yè),編輯于2023年,星期四注意:(1)定義一個(gè)函數(shù)指針與定義一個(gè)返回值是指針的函數(shù)不同 int(*f_p)(constchar*);//定義一個(gè)函數(shù)的指針 int*func_p(chara){…}//定義一個(gè)返回指針的函數(shù)(2)可以用typedef簡(jiǎn)化函數(shù)指針的使用,如下例: typedefint(*FUN)(inta,intb); //聲明(*FUN)是一個(gè)函數(shù)指針類(lèi)型 FUNfunc_p; //func_p為一個(gè)返回整型和兩個(gè)整型參數(shù)的函數(shù)指針(3)函數(shù)指針可以和其他指針一樣地使用面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第十九頁(yè),共八十四頁(yè),編輯于2023年,星期四回調(diào)函數(shù) 簡(jiǎn)單來(lái)說(shuō),回調(diào)函數(shù)就是指通過(guò)函數(shù)指針調(diào)用的函數(shù)。當(dāng)你把函數(shù)指針作為參數(shù)傳遞給另一個(gè)函數(shù),另一個(gè)函數(shù)通過(guò)該指針調(diào)用該函數(shù),我們就稱(chēng)被調(diào)用的這個(gè)函數(shù)為一個(gè)回調(diào)函數(shù)。如下所示:

voidCallBack(chara){…} //準(zhǔn)備作為回調(diào)函數(shù)的函數(shù) int(*func_p)(chara);//指向回調(diào)函數(shù)的指針 func_p=CallBack; //將函數(shù)指針指向回調(diào)函數(shù) voidfun(intx,int(*f_p)(chara)){(*f_p)(“hello”);…} //準(zhǔn)備使用回調(diào)函數(shù)的函數(shù) fun(5,func_p); //使用回調(diào)函數(shù),我們通過(guò)函數(shù)指針 //隱式的調(diào)用了回調(diào)函數(shù)void //CallBack(chara)面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十頁(yè),共八十四頁(yè),編輯于2023年,星期四

回調(diào)函數(shù)可以消除調(diào)用者和被調(diào)用者之間的耦合性。調(diào)用者不用關(guān)心需要調(diào)用哪個(gè)函數(shù),它所需要知道的僅僅是函數(shù)原型。讓我們通過(guò)一個(gè)例子來(lái)體會(huì)回調(diào)函數(shù)的威力。假設(shè)我們開(kāi)發(fā)了若干個(gè)函數(shù)用來(lái)求兩數(shù)之和,這些函數(shù)針對(duì)不同的數(shù)據(jù)類(lèi)型:

voidSumForInt(int*oper1,int*oper2,int*result){ *result=*oper1+*oper2;}voidSumForFloat(float*oper1,float*oper2,float*result){ *result=*oper1+*oper2;}voidSumForDouble(double*oper1,double*oper2,double*result){ *result=*oper1+*oper2;}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十一頁(yè),共八十四頁(yè),編輯于2023年,星期四

但是這些函數(shù)名各不相同,無(wú)法向使用者提供一個(gè)統(tǒng)一的接口,為了達(dá)到這個(gè)目的,我們可以采用回調(diào)函數(shù)機(jī)制:voidSum(void*operand1,void*operand2,void*result,void(*pSum)(void*,void*,void*)) //這里pSum就是一個(gè)指向回調(diào)函數(shù)的指針。 //定義統(tǒng)一接口:voidSum(void*operand1,void*operand2,void*result,void(*pSum)(void*,void*,void*)){ (*pSum)(operand1,operand2,result);}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十二頁(yè),共八十四頁(yè),編輯于2023年,星期四下面一段代碼向讀者介紹如何使用這個(gè)接口:voidmain(){ intiOper1=1; intiOper2=2; intiResult; floatfOper1=1.3f; floatfOper2=2.6f; floatfResult; doubledOper1=1.5; doubledOper2=2.8; doubledResult; Sum(&iOper1,&iOper2,&iResult,SumForInt); //兩個(gè)整數(shù)相加 Sum(&fOper1,&fOper2,&fResult,SumForFloat); //兩個(gè)單精度數(shù)相加 Sum(&dOper1,&dOper2,&dResult,SumForDouble);//兩個(gè)雙精度數(shù)相加}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十三頁(yè),共八十四頁(yè),編輯于2023年,星期四

在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中回調(diào)函數(shù)應(yīng)用非常廣泛,如windows的窗體消息處理函數(shù)就使用了回調(diào)函數(shù)機(jī)制,當(dāng)注冊(cè)窗體類(lèi)時(shí),需要傳入該窗體的消息處理函數(shù)指針,這樣窗體的創(chuàng)建是由系統(tǒng)完成,而窗體消息的處理,則由開(kāi)發(fā)人員定制,從而為窗體的創(chuàng)建和處理解耦。第二十四頁(yè),共八十四頁(yè),編輯于2023年,星期四注意:⑴在面向?qū)ο蟮某绦蛟O(shè)計(jì)過(guò)程中,通常將回調(diào)函數(shù)定義為類(lèi)的靜態(tài)成員函數(shù)。這是因?yàn)轭?lèi)的非靜態(tài)成員函數(shù)指針代表的是在某個(gè)實(shí)例中該函數(shù)相對(duì)于實(shí)例首址的偏移量,而不是它在內(nèi)存中的絕對(duì)地址,因此不能脫離實(shí)例單獨(dú)作為回調(diào)函數(shù)指針來(lái)使用。⑵有的程序員直接將全局函數(shù)作為回調(diào)函數(shù)。此種做法打破了面向?qū)ο蟮木幊田L(fēng)格,因此不建議使用。⑶回調(diào)函數(shù)的使用是滯后聯(lián)編的,主要取決于在調(diào)用時(shí)函數(shù)指針指向了哪個(gè)函數(shù),因此也可以說(shuō),回調(diào)函數(shù)機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)中多態(tài)性的另一種體現(xiàn)。

面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十五頁(yè),共八十四頁(yè),編輯于2023年,星期四5.3.4內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)的引入較好地解決了時(shí)間開(kāi)銷(xiāo)的問(wèn)題。這是因?yàn)樵诔绦蚓幾g時(shí),編譯器將程序中調(diào)用內(nèi)聯(lián)函數(shù)的表達(dá)式,用內(nèi)聯(lián)函數(shù)的函數(shù)體來(lái)代替。但是,由于編譯時(shí)用函數(shù)體替代了調(diào)用表達(dá)式,因而增加了目標(biāo)程序的代碼量,帶來(lái)了空間開(kāi)銷(xiāo)的增加。定義內(nèi)聯(lián)函數(shù)的一般格式如下:inlineintf_add(intx,inty){ returnx+y;}其中,inline是關(guān)鍵字用來(lái)說(shuō)明f_add()是一個(gè)內(nèi)聯(lián)函數(shù)。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十六頁(yè),共八十四頁(yè),編輯于2023年,星期四請(qǐng)看下例:intmain(){ f_add(2,3); return0;}注意:(1)內(nèi)聯(lián)函數(shù)體內(nèi)不允許使用循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句(這兩種語(yǔ)句的介紹見(jiàn)5.4節(jié));(2)內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次調(diào)用之前;(3)所有在類(lèi)定義體內(nèi)部定義的函數(shù)都是內(nèi)聯(lián)函數(shù)(虛函數(shù)除外);面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十七頁(yè),共八十四頁(yè),編輯于2023年,星期四5.4運(yùn)算符和表達(dá)式

5.4.1運(yùn)算符及運(yùn)算符優(yōu)先級(jí)像代數(shù)中一樣,C++中的運(yùn)算符是連接參加運(yùn)算的數(shù)據(jù)的符號(hào),不同的運(yùn)算符規(guī)定了不同的運(yùn)算方法和不同的運(yùn)算規(guī)則(如先乘除后加減)C++語(yǔ)言的運(yùn)算符,基本上可以分為以下幾種類(lèi)型。見(jiàn)下表5.1所示。其中,結(jié)合性是指:當(dāng)一個(gè)表達(dá)式由相同優(yōu)先級(jí)的運(yùn)算符構(gòu)成時(shí),其運(yùn)算符的優(yōu)先次序問(wèn)題。L表示從左到右地依次進(jìn)行,R表示由右向左依次進(jìn)行。第二十八頁(yè),共八十四頁(yè),編輯于2023年,星期四優(yōu)先順序類(lèi)別符號(hào)舉例功能結(jié)合性1作用域運(yùn)算符::::ex_x全局范圍(ex_x是全局變量)R::Myclass::count類(lèi)范圍(訪問(wèn)Myclass類(lèi)中的靜態(tài)成員)L2成員存取運(yùn)算符→Pa→xPa是指針對(duì)象,x是成員L·a·xa是非指針對(duì)象,x是成員數(shù)組下標(biāo)運(yùn)算符[]X=A[5]將數(shù)組A中下標(biāo)為5的元素賦給XL函數(shù)調(diào)用運(yùn)算符()X=f()將函數(shù)f()的返回值賦給XL3Sizeof運(yùn)算符sizeofsizeof(X)獲得數(shù)據(jù)類(lèi)型X的長(zhǎng)度R增量與減量運(yùn)算符++++X使用X之前,先使X的值加1R++X++使用X之后,再使X的值加1R----X使用X之前,先使X的值減1R--X--使用X之后,再使X的值減1R邏輯非運(yùn)算符!!(X>Z)將!右邊的結(jié)果(邏輯值)取非R按位取反運(yùn)算符~~A將A值按位取反R取地址與取值運(yùn)算符&pX=&Y提取變量Y的地址,然后賦給指針變量pXR*X=*pY提取指針變量pY所指的地址單元的內(nèi)容,然后賦給變量X類(lèi)型轉(zhuǎn)換運(yùn)算符(類(lèi)型)X=(int)Y將Y轉(zhuǎn)換為整型,然后賦給XR動(dòng)態(tài)內(nèi)存分配運(yùn)算符NewPa=newint[4];創(chuàng)建一個(gè)整型數(shù)組,其中含有4個(gè)元素,并將首地址給PaRdeletedelete[]Pa;deletePb;數(shù)組必須用delete[]進(jìn)行刪除普通的堆對(duì)象可用delete刪除面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第二十九頁(yè),共八十四頁(yè),編輯于2023年,星期四4-*X*Y將兩數(shù)相乘L/X/Y將兩數(shù)相除%X%Y將兩數(shù)相除取其余數(shù)5+X+Y將兩數(shù)相加X(jué)–Y將兩數(shù)相減6移位運(yùn)算符<<A<<2將A值向左平移2位L>>A>>2將A值向右平移2位7!=<X<Y判斷X是否小于YL>X>Y判斷X是否大于Y<=X<=Y判斷X是否小于等于Y>=X>=Y判斷X是否大于等于Y8==X==Y判斷X是否等于YX!=Y判斷X是否不等于Y9位運(yùn)算符&A&B將A和B的值按位相與L10^A^B將A和B的值按位相異或11|A|B將A和B的值按位相或12邏輯運(yùn)算符&&X<Y&&X>Z將&&兩邊的結(jié)果(邏輯值)相與L13||X<Y||X>Z將||兩邊的結(jié)果(邏輯值)相或14條件運(yùn)算符?:Z=X>Y?E1:E2;如果X>Y為真,Z等于E1的值,否則等于E2的值R面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三十頁(yè),共八十四頁(yè),編輯于2023年,星期四15賦值運(yùn)算符=X=Y將Y的值賦給XR+=X+=Y將X的值加Y后,再賦給X,等價(jià)于X=X+Y-=X-=Y將X的值減Y后,再賦給X,等價(jià)于X=X–Y*=X*=Y將X的值乘Y后,再賦給X,等價(jià)于X=X*Y/=X/=Y將X的值除Y后,再賦給X,等價(jià)于X=X/Y%=X%=Y將X的值對(duì)Y取余后,再賦給X,等價(jià)于X=X%Y&=X&=Y將X的值與Y按位相與后,再賦給X,等價(jià)于X=X&Y^=X^=Y將X的值與Y按位相異或后,再賦給X,等價(jià)于X=X^Y|=X|=Y將X的值與Y按位相或后,再賦給X,等價(jià)于X=X|Y<<=X<<=Y將X的值左移Y位后,再賦給X,等價(jià)于X=X<<Y>>=X>>=Y將X的值右移Y位后,再賦給X,等價(jià)于X=X>>Y16逗號(hào)運(yùn)算符,E1,E2,E3從左到右依次求出表達(dá)式E1,E2,E3的值L面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三十一頁(yè),共八十四頁(yè),編輯于2023年,星期四5.4.2表達(dá)式所謂表達(dá)式是指:用運(yùn)算符將運(yùn)算對(duì)象(也稱(chēng)操作數(shù))連接起來(lái)的、符合語(yǔ)法規(guī)則的式子。根據(jù)連接運(yùn)算對(duì)象的連接符(運(yùn)算符)的不同大體上可以將表達(dá)式分為以下四種:⒈算術(shù)運(yùn)算表達(dá)式(算術(shù)運(yùn)算表達(dá)式的運(yùn)算結(jié)果是數(shù)值)⒉邏輯運(yùn)算表達(dá)式(邏輯運(yùn)算表達(dá)式的運(yùn)算結(jié)果是邏輯值)⒊賦值運(yùn)算表達(dá)式(賦值運(yùn)算符的結(jié)合性是從右向左的)⒋逗號(hào)運(yùn)算表達(dá)式(逗號(hào)運(yùn)算表達(dá)式的值是最后一個(gè)表達(dá)式的值)面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三十二頁(yè),共八十四頁(yè),編輯于2023年,星期四注意:

⑴當(dāng)一個(gè)表達(dá)式中包含多種運(yùn)算符時(shí),必須考慮運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。⑵可以用()改變運(yùn)算符的優(yōu)先級(jí);例如: inti=1,n=2; n=i+n<<1;//因?yàn)椤?”高于“<<”高于“=”,所以先運(yùn)算i+n等于3, //再運(yùn)算3<<1得6,最后n=6。用“()”改變先后次序如下: inti=1,n=2; n=i+(n<<1);//因?yàn)椋╪<<1)高于“+”高于“=”,所以先運(yùn)算n<<1等 //于4,再將4+1得5,最后n=5。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三十三頁(yè),共八十四頁(yè),編輯于2023年,星期四⑶只要符合表達(dá)式定義的式子,都是表達(dá)式,不一定非要包含賦值運(yùn)算符,如下面的式子都是正確的C++表達(dá)式: 3+5; a,b,c; x>y?e1:e2; i++;⑷賦值運(yùn)算符左側(cè)必須是一個(gè)可以引用的存儲(chǔ)單元(如:變量),決不能是表達(dá)式。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三十四頁(yè),共八十四頁(yè),編輯于2023年,星期四5.4.3數(shù)據(jù)類(lèi)型的轉(zhuǎn)換類(lèi)型轉(zhuǎn)換就是將一種類(lèi)型的值轉(zhuǎn)換為另一種類(lèi)型的值。⒈隱式類(lèi)型轉(zhuǎn)換其轉(zhuǎn)換過(guò)程是由系統(tǒng)按照一定的轉(zhuǎn)換規(guī)則自動(dòng)完成的。(1)當(dāng)char或short型數(shù)據(jù)與int型數(shù)據(jù)進(jìn)行運(yùn)算時(shí),將char或short型裝換成int類(lèi)型;(2)當(dāng)兩個(gè)運(yùn)算對(duì)象數(shù)據(jù)類(lèi)型不一致時(shí),在做算術(shù)運(yùn)算前,級(jí)別低的自動(dòng)轉(zhuǎn)換為級(jí)別高的數(shù)據(jù)類(lèi)型(3)在賦值表達(dá)式E1=E2的情況下,賦值運(yùn)算符右端E2的結(jié)果值需轉(zhuǎn)換為E1類(lèi)型,然后賦值。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三十五頁(yè),共八十四頁(yè),編輯于2023年,星期四⒉顯式類(lèi)型轉(zhuǎn)換顯式類(lèi)型轉(zhuǎn)換的方法有兩種。(1)強(qiáng)制轉(zhuǎn)換法強(qiáng)制轉(zhuǎn)換法的格式為:(類(lèi)型名)表達(dá)式;如:(int)x;在強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí),得到一個(gè)所需類(lèi)型的中間變量,原來(lái)變量的類(lèi)型未發(fā)生變化。(2)函數(shù)法函數(shù)法的轉(zhuǎn)換格式為:類(lèi)型名(表達(dá)式);如:int(x);第三十六頁(yè),共八十四頁(yè),編輯于2023年,星期四顯示類(lèi)型轉(zhuǎn)換有時(shí)是必需的,如前面提到的void*指針。我們必須將malloc返回的void*指針顯示轉(zhuǎn)換為特定的類(lèi)型

int*p=static_cast<int*>(malloc(100));(int)3.1415;//就是取整數(shù)部分(int)a%10;//取a的個(gè)位數(shù)第三十七頁(yè),共八十四頁(yè),編輯于2023年,星期四在程序設(shè)計(jì)過(guò)程中,使用以下三種控制結(jié)構(gòu)作為算法的基本單元。事實(shí)上,任何一個(gè)成員函數(shù)的定義都離不開(kāi)這三種基本結(jié)構(gòu):

5.5.1順序結(jié)構(gòu)

順序結(jié)構(gòu)是指程序語(yǔ)句按順序,自上而下依次執(zhí)行

5.5.2選擇結(jié)構(gòu)(又稱(chēng)分支結(jié)構(gòu))

選擇結(jié)構(gòu)是指能根據(jù)選擇條件,改變程序走向的一種語(yǔ)句

5.5.3循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)是指能根據(jù)循環(huán)條件,重復(fù)執(zhí)行某段程序的一種語(yǔ)句。是代碼可重用技術(shù)的一種基本形式

5.5控制結(jié)構(gòu)第三十八頁(yè),共八十四頁(yè),編輯于2023年,星期四5.5.1順序結(jié)構(gòu)順序結(jié)構(gòu)是指程序語(yǔ)句按順序,自上而下依次執(zhí)行。如,輸入三角形的三邊長(zhǎng),求三角形面積的函數(shù)。floatf_area(floata,floatb,floatc){ floats; s=1.0/2*(a+b+c); returnsqrt(s*(s–a)*(s-b)*(s-c));}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第三十九頁(yè),共八十四頁(yè),編輯于2023年,星期四5.5.2選擇結(jié)構(gòu)(又稱(chēng)分支結(jié)構(gòu))⒈if和if…else⑴if是最簡(jiǎn)單的選擇語(yǔ)句,一般格式為: if(<條件表達(dá)式>)<語(yǔ)句>我們所要執(zhí)行的語(yǔ)句多于一條時(shí),C++規(guī)定,必須將這些語(yǔ)句用“{”和“}”括起來(lái)。一般格式為:if(<條件表達(dá)式>){ <語(yǔ)句1> <語(yǔ)句2> … <語(yǔ)句n>} <語(yǔ)句n+1>面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十頁(yè),共八十四頁(yè),編輯于2023年,星期四⑵if…else是用來(lái)解決在互相對(duì)立的兩種條件下,所要分別進(jìn)行處理的兩批語(yǔ)句。

if(<條件表達(dá)式>){ <語(yǔ)句1> <語(yǔ)句2> … <語(yǔ)句n>}else{ <語(yǔ)句n+1> <語(yǔ)句n+2> … <語(yǔ)句n+k>}<語(yǔ)句n+k+1>面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十一頁(yè),共八十四頁(yè),編輯于2023年,星期四⑶當(dāng)分支結(jié)構(gòu)(即選擇結(jié)構(gòu))的分支較多時(shí),C++提供了嵌套式的選擇結(jié)構(gòu):if(<條件表達(dá)式1>){ <語(yǔ)句1> <語(yǔ)句2> … <語(yǔ)句n>}elseif(<條件表達(dá)式2>){ <語(yǔ)句n+1> <語(yǔ)句n+2> … <語(yǔ)句n+k>}else{ <語(yǔ)句n+k+1> <語(yǔ)句n+k+2> … <語(yǔ)句n+k+m>}<語(yǔ)句n+k+m+1>面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十二頁(yè),共八十四頁(yè),編輯于2023年,星期四

例如,設(shè)計(jì)一個(gè)函數(shù),當(dāng)輸入大于0時(shí),輸出為1;當(dāng)輸入小于0時(shí),輸出為-1;當(dāng)輸入等于0時(shí),輸出為0;(注意本例中判斷條件有三種情況)intf_s(intx){ if(x<0) { x=-1; }elseif(x>0) //到此排除了x<0的情況,剩下x>0和x=0的情況 { x=1; }else //到此排除了x<0的情況和x>0的情況,只剩下x=0的情況 { x=0; } returnx;}注意:判斷條件之間存在排除關(guān)系的這種情況,一般采用if…elseif…else這種形式進(jìn)行處理面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十三頁(yè),共八十四頁(yè),編輯于2023年,星期四

switch語(yǔ)句又稱(chēng)開(kāi)關(guān)語(yǔ)句。主要用于根據(jù)某個(gè)整型數(shù)據(jù)的變化,達(dá)到多種分支的目的。一般格式為:

switch(整型表達(dá)式E){ case整型表達(dá)式E1: 語(yǔ)句系列1; break; //跳過(guò)下面的所有語(yǔ)句直接去執(zhí)行語(yǔ)句k+2; case整型表達(dá)式E2: 語(yǔ)句系列2; break; … case整型表達(dá)式Ek: 語(yǔ)句系列k; break; default: 語(yǔ)句系列k+1;} //開(kāi)關(guān)語(yǔ)句結(jié)束 語(yǔ)句k+2; …面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十四頁(yè),共八十四頁(yè),編輯于2023年,星期四注意:

整型表達(dá)式E,E1,E2,…,Ek的值,是整型數(shù)據(jù)(或者字符變量、字符常量)。當(dāng)整型表達(dá)式E的值等于整型表達(dá)式E1的值時(shí),執(zhí)行語(yǔ)句系列1;同理當(dāng)整型表達(dá)式E的值等于整型表達(dá)式Ek的值時(shí),執(zhí)行語(yǔ)句系列k。當(dāng)程序執(zhí)行到break時(shí),將跳過(guò)下面所有的語(yǔ)句,執(zhí)行開(kāi)關(guān)語(yǔ)句后的語(yǔ)句,即語(yǔ)句k+2。當(dāng)整型表達(dá)式E的值不等于整型表達(dá)式E1,E2,…,Ek的值時(shí),則執(zhí)行default語(yǔ)句下的語(yǔ)句系列k+1。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十五頁(yè),共八十四頁(yè),編輯于2023年,星期四例如,編程實(shí)現(xiàn)兩個(gè)浮點(diǎn)數(shù)的四則運(yùn)算函數(shù)f_arith:floatf_arith(floatd1,floatd2,charop){ floattemp; switch(op) { case‘+’: temp=d1+d2; break; //跳過(guò)下面的所有語(yǔ)句直接去執(zhí)行switch語(yǔ)句后面的語(yǔ)句 case‘-’: temp=d1-d2; break; case‘*’: temp=d1*d2; break; case‘/’: temp=d1/d2; break; default: temp=-100; } //開(kāi)關(guān)語(yǔ)句結(jié)束 returntemp;} //函數(shù)結(jié)束面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十六頁(yè),共八十四頁(yè),編輯于2023年,星期四5.5.3循環(huán)結(jié)構(gòu)⒈for語(yǔ)句⑴當(dāng)參加循環(huán)的語(yǔ)句(又稱(chēng)循環(huán)體),只有一條語(yǔ)句時(shí),其一般格式為:for(E1;E2;E3) <循環(huán)體語(yǔ)句1>例如:計(jì)算從1到n的自然數(shù)的累加和函數(shù)f_sum。intf_sum(intn){ inti,sum=0; for(i=1;i<n+1;i++) { sum+=i; } returnsum;}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十七頁(yè),共八十四頁(yè),編輯于2023年,星期四⑵當(dāng)參加循環(huán)的語(yǔ)句,多于一條語(yǔ)句時(shí),需要用“{”和“}”將循環(huán)體括起來(lái)。其一般格式為:for(E1;E2;E3){ <循環(huán)體語(yǔ)句1> <循環(huán)體語(yǔ)句2> … <循環(huán)體語(yǔ)句n>}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十八頁(yè),共八十四頁(yè),編輯于2023年,星期四⑶break語(yǔ)句與continue語(yǔ)句對(duì)循環(huán)的影響break語(yǔ)句:

當(dāng)某個(gè)條件滿足,我們想結(jié)束循環(huán)時(shí),采用這個(gè)語(yǔ)句。其一般形式為:for(…){ <語(yǔ)句系列> if(條件表達(dá)式E) break; //離開(kāi)整個(gè)循環(huán)直接跳到循環(huán)體外,執(zhí)行<語(yǔ)句n+1> ….}<語(yǔ)句n+1>面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第四十九頁(yè),共八十四頁(yè),編輯于2023年,星期四continue語(yǔ)句: 當(dāng)某個(gè)條件滿足,我們并不想結(jié)束循環(huán),只想跳過(guò)某些循環(huán)語(yǔ)句時(shí),采用這個(gè)語(yǔ)句。其一般形式為:for(…) //循環(huán)起點(diǎn){ <語(yǔ)句系列1> if(條件表達(dá)式E) continue; //跳過(guò)<語(yǔ)句系列2>,重返循環(huán)起點(diǎn) <語(yǔ)句系列2>} //循環(huán)終點(diǎn)<語(yǔ)句n+1>面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十頁(yè),共八十四頁(yè),編輯于2023年,星期四計(jì)算[n,n+k]范圍內(nèi)的自然數(shù)中偶數(shù)的累加和(其中n和k均為自然數(shù))intf_psum(intn,intk){ intsum=0; while(n>0) //確保n是自然數(shù)才計(jì)算 { if(k<0) //結(jié)束計(jì)算的條件,即跳出循環(huán) { break; } if((n+k--)%2!=0)//奇數(shù)不累加,即跳過(guò)下面的語(yǔ)句重返循環(huán)起點(diǎn) { continue; } sum+=n+k+1; } returnsum;}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十一頁(yè),共八十四頁(yè),編輯于2023年,星期四⑷多重循環(huán)。在某個(gè)循環(huán)語(yǔ)句內(nèi)還包含另一個(gè)循環(huán)語(yǔ)句。C++中稱(chēng)為多重循環(huán)(或循環(huán)嵌套)。其一般格式為:for(E1;E2;E3) //外循環(huán)語(yǔ)句起點(diǎn){ <外循環(huán)體語(yǔ)句1> //外循環(huán)體語(yǔ)句系列 <外循環(huán)體語(yǔ)句2> for(E11;E22;E33) //內(nèi)循環(huán)語(yǔ)句起點(diǎn) { <內(nèi)循環(huán)體語(yǔ)句1> //內(nèi)循環(huán)體語(yǔ)句系列<內(nèi)循環(huán)體語(yǔ)句2> … <內(nèi)循環(huán)體語(yǔ)句n> } //內(nèi)循環(huán)語(yǔ)句終點(diǎn) …<外循環(huán)體語(yǔ)句n>} //外循環(huán)語(yǔ)句終點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十二頁(yè),共八十四頁(yè),編輯于2023年,星期四⒉while語(yǔ)句一般格式為:while(<條件表達(dá)式>){ <循環(huán)體語(yǔ)句系列>}⒊do…while語(yǔ)句一般格式為:do{ <語(yǔ)句系列> }while(<條件表達(dá)式>);面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十三頁(yè),共八十四頁(yè),編輯于2023年,星期四注意:

循環(huán)語(yǔ)句的形式比較多,要根據(jù)需要合理選用。while和do…while型循環(huán)語(yǔ)句,同樣可以實(shí)現(xiàn)多層嵌。break和continue語(yǔ)句均可使用于while和do…while語(yǔ)句,但是,它們僅作用于本層循環(huán)上,在任何一層上要實(shí)現(xiàn)break和continue的操作,都必須在這一層中增加這兩條語(yǔ)句。在書(shū)寫(xiě)時(shí),不要忘記do…while語(yǔ)句中最后的“;”。建議讀者養(yǎng)成良好編程習(xí)慣,不要在循環(huán)體內(nèi)說(shuō)明數(shù)據(jù)成員或者函數(shù)的原型,如:intnum;或者char*func(inta,char*s);類(lèi)似的聲明應(yīng)在循環(huán)體外。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十四頁(yè),共八十四頁(yè),編輯于2023年,星期四5.5.4遞歸——函數(shù)的自我調(diào)用前面介紹了控制結(jié)構(gòu),下面我們通過(guò)遞歸的學(xué)習(xí)進(jìn)一步加強(qiáng)對(duì)控制結(jié)構(gòu)的理解。所謂“遞歸”是指通過(guò)重復(fù)執(zhí)行相同的計(jì)算來(lái)解決問(wèn)題。簡(jiǎn)單的說(shuō),遞歸就是函數(shù)直接或間接地自己調(diào)用自己。從而使得程序簡(jiǎn)短。編寫(xiě)遞歸程序的關(guān)鍵是:(1)構(gòu)造遞歸表達(dá)式。將n階的問(wèn)題轉(zhuǎn)化為比n階小的問(wèn)題,轉(zhuǎn)化以后的問(wèn)題與原來(lái)的問(wèn)題的解法是相同的。(2)必須尋找一個(gè)明確的遞歸結(jié)束條件,稱(chēng)為遞歸出口。 遞歸是在函數(shù)中出現(xiàn)調(diào)用函數(shù)本身的語(yǔ)句,只是每次調(diào)用時(shí)函數(shù)的實(shí)參值不一樣,如果代碼中沒(méi)有包含終止調(diào)用的控制語(yǔ)句,將無(wú)限循環(huán)下去。因此,通常用if語(yǔ)句中條件的判斷來(lái)決定是否跳出這個(gè)遞歸過(guò)程。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十五頁(yè),共八十四頁(yè),編輯于2023年,星期四#include<stdafx.h>#include<iostream.h>intf(intx){ inty; if(x==0||x==1){return3;} y=x-f(x-2); returny;}voidmain(){ cout<<“f(5)=”<<f(5)<<endl; cout<<“f(6)=”<<f(6)<<endl; cout<<“f(8)=”<<f(8)<<endl;}運(yùn)行結(jié)果為:f(5)=5f(6)=1f(8)=7面向?qū)ο蟪绦蛟O(shè)計(jì)第二版下面請(qǐng)同學(xué)們看一個(gè)例子:第五十六頁(yè),共八十四頁(yè),編輯于2023年,星期四注意:⒈使用遞歸編寫(xiě)程序雖然代碼較少,但程序的可讀性較差。⒉使用遞歸時(shí)層次不能太深,一般不超過(guò)3層。多層函數(shù)遞歸將造成系統(tǒng)資源的嚴(yán)重浪費(fèi)。⒊由于遞歸的缺點(diǎn)很明顯,所以在實(shí)際開(kāi)發(fā)工作中不建議使用遞歸。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十七頁(yè),共八十四頁(yè),編輯于2023年,星期四5.6函數(shù)的參數(shù)的傳遞機(jī)制

當(dāng)一個(gè)函數(shù)定義有形參時(shí),在進(jìn)行函數(shù)調(diào)用時(shí),必須提供與形參個(gè)數(shù)相同、順序相同、類(lèi)型相同的實(shí)參;或通過(guò)類(lèi)型轉(zhuǎn)換能夠?qū)?shí)參的值映射為形參類(lèi)型的值。在C++中,可以使用兩種傳遞機(jī)制將實(shí)參的值傳遞給形參: 一種被稱(chēng)為值傳遞(值調(diào)用)。 另一種被稱(chēng)為引用傳遞(引用調(diào)用)。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十八頁(yè),共八十四頁(yè),編輯于2023年,星期四5.6.1值調(diào)用C++中變量的值有兩種:變量本身值和變量地址值。1.傳值調(diào)用的特點(diǎn):調(diào)用時(shí)系統(tǒng)先計(jì)算實(shí)參表達(dá)式的值,然后依次賦給形參。因此,傳值調(diào)用的實(shí)現(xiàn)機(jī)制是系統(tǒng)將實(shí)參拷貝一個(gè)副本給形參。在被調(diào)用的函數(shù)中參數(shù)(即參數(shù)的副本)被改變,但未改變實(shí)參的值(即不能“回帶”)。例如:交換兩個(gè)變量a和b的值(采用傳值調(diào)用)。voidf_swap1(intA,intB){ inttemp; temp=A; A=B; B=temp; cout<<“A=”<<A<<”“<<”B=”<<B<<endl;}

面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第五十九頁(yè),共八十四頁(yè),編輯于2023年,星期四voidmain(){ inta=5,b=6; f_swap1(a,b);//執(zhí)行完該語(yǔ)句后,變量的值沒(méi)有改變 cout<<“a=”<<a<<“”<<“b=”<<b<<endl;}運(yùn)行結(jié)果如下:A=6 B=5//函數(shù)內(nèi)的結(jié)果a=5 b=6//主函數(shù)中的結(jié)果,可見(jiàn)通過(guò)傳值調(diào)用//a、b的 值并沒(méi)有被“回帶”面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十頁(yè),共八十四頁(yè),編輯于2023年,星期四2.傳址調(diào)用的特點(diǎn)使用傳址調(diào)用方式時(shí),調(diào)用函數(shù)的實(shí)參是某個(gè)變量的地址值,被調(diào)用的函數(shù)的形參是指針(變量的指針或類(lèi)類(lèi)型的變量的指針)。請(qǐng)注意,不能通過(guò)return返回或者通過(guò)參數(shù)“回帶”在函數(shù)中定義的局部變量的地址(或指針)。例如,通過(guò)函數(shù)返回、指針參數(shù)和引用參數(shù)來(lái)得到函數(shù)中局部變量的值。下面的做法結(jié)果是錯(cuò)誤的:int*f_pIntandInt(int*y,int&x){ inta=5; int*s=&a; y=s;//y=&a; x=a; returns;}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十一頁(yè),共八十四頁(yè),編輯于2023年,星期四voidmain(){ inta=6,b=7; int*pa=&a; int*x=f_pIntandInt(pa,b); //執(zhí)行完該語(yǔ)句后,變量的值將被改變 cout<<”*x=“<<*x<<endl; cout<<”*pa=”<<*pa<<endl; cout<<”b=”<<b<<endl;}運(yùn)行結(jié)果如下: *x=351 //*x不是5而是個(gè)隨機(jī)數(shù) *pa=6 //*pa也不是5且未被修改 b=5 //“回帶”了值5面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十二頁(yè),共八十四頁(yè),編輯于2023年,星期四5.6.2引用調(diào)用使用引用作為函數(shù)的形參時(shí),調(diào)用函數(shù)的實(shí)參要用變量名,將實(shí)參的變量名傳給形參的引用,相當(dāng)于在被調(diào)用函數(shù)中使用了實(shí)參的別名。例如:交換兩個(gè)變量a和b的值。(采用引用調(diào)用)voidf_swap3(int&A,int&B){ inttemp; temp=A; A=B; //交換兩個(gè)引用變量中的內(nèi)容(改變實(shí)參值) B=temp; cout<<“A=”<<A<<”“<<”B=”<<B<<endl;}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十三頁(yè),共八十四頁(yè),編輯于2023年,星期四voidmain(){ inta=5,b=6; f_swap3(a,b);//變量的地址沒(méi)變,但是變量的值被間接改變 cout<<“a=”<<a<<”“<<”b=”<<b<<endl;}運(yùn)行結(jié)果如下: A=6B=5//函數(shù)內(nèi)的結(jié)果 a=6b=5//主函數(shù)中的結(jié)果,可見(jiàn)引用調(diào)用a、b的值被“回帶”建議:在需要“回帶”值的時(shí)候,使用引用。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十四頁(yè),共八十四頁(yè),編輯于2023年,星期四5.7函數(shù)的參數(shù)

5.7.1函數(shù)參數(shù)的求值順序

當(dāng)一個(gè)函數(shù)帶有多個(gè)參數(shù)時(shí),C++語(yǔ)言沒(méi)有規(guī)定在函數(shù)調(diào)用時(shí)對(duì)實(shí)參的求值的順序,編譯器根據(jù)對(duì)代碼進(jìn)行優(yōu)化的需要自行決定對(duì)實(shí)參的求值順序。有的編譯器規(guī)定自左向右,有的編譯器規(guī)定自右向左,這種求值順序的不同,對(duì)一般參數(shù)來(lái)講沒(méi)有影響。但是,如果實(shí)參表達(dá)式中的某個(gè)變量與前后表達(dá)式中的某個(gè)變量有關(guān)時(shí),就可能由于求和順序的不同而造成了二義性。因此,建議將參數(shù)列表簡(jiǎn)單化為好(相關(guān)運(yùn)算放在調(diào)用前)。(舉例如下)面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十五頁(yè),共八十四頁(yè),編輯于2023年,星期四intf_add_int(intx,inty,intz){ returnx+y+z;}voidmain(){ intx=5,y=6,z=7,c; c=f_add_int(++x,x+y+z,--z);}如果編譯器規(guī)定自左向右的求值,則

c=f_add_int(6,6+6+7,6),c=31;如果編譯器規(guī)定自右向左的求值,則 c=f_add_int(6,5+6+6,6),c=29;面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十六頁(yè),共八十四頁(yè),編輯于2023年,星期四5.7.2數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)時(shí),根據(jù)調(diào)用機(jī)制的不同,可以分為兩種情況:⒈形參用數(shù)組,實(shí)參用數(shù)組名調(diào)用函數(shù)的實(shí)參用數(shù)組名,被調(diào)用的函數(shù)的形參用數(shù)組,這種調(diào)用的機(jī)制是形參和實(shí)參共用內(nèi)存中的同一個(gè)數(shù)組。例如:檢查數(shù)組A[m],將數(shù)組中小于0的數(shù)改寫(xiě)為0;voidf_rw1(intA[],intn)//定義時(shí)形參要標(biāo)明數(shù)組元素的類(lèi)型、數(shù)組名{ for(inti=0;i<n;i++) { if(*(A+i)<0) { *(A+i)=0; } }}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十七頁(yè),共八十四頁(yè),編輯于2023年,星期四voidmain(){ inta[4]={1,-5,4,-3}; intn=4; f_rw1(a,4); //調(diào)用時(shí)實(shí)參只寫(xiě)數(shù)組名}結(jié)果是a中的元素變?yōu)椋?,0,4,0面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十八頁(yè),共八十四頁(yè),編輯于2023年,星期四⒉形參用指針實(shí)參用數(shù)組名調(diào)用函數(shù)的實(shí)參用數(shù)組名,被調(diào)用的函數(shù)的形參用指針,這種調(diào)用的機(jī)制是實(shí)參把數(shù)組的名字傳遞給形參。例如:檢查數(shù)組A[m],將數(shù)組中小于0的數(shù)改寫(xiě)為0;voidf_rw2(int*A,intn) //形參用指針{ for(inti=0;i<n;i++) { if(*(A+i)<0) { *(A+i)=0; } }}voidmain(){inta[4]={1,-5,4,-3};intn=4;f_rw2(a,4); //調(diào)用時(shí)實(shí)參只寫(xiě)數(shù)組名}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第六十九頁(yè),共八十四頁(yè),編輯于2023年,星期四5.7.3帶缺省值的函數(shù)C++語(yǔ)言允許在函數(shù)的原型中(若沒(méi)有說(shuō)明函數(shù)的原型,則應(yīng)在函數(shù)定義時(shí)),給一個(gè)或多個(gè)參數(shù)指定默認(rèn)值。但是,在指定了默認(rèn)值的參數(shù)右邊不能出現(xiàn)沒(méi)有指定默認(rèn)值的參數(shù)。在函數(shù)調(diào)用時(shí),編譯器按從左到右的順序?qū)?shí)參傳給形參,當(dāng)實(shí)參的數(shù)目不足時(shí),編譯器將按同樣的順序用函數(shù)定義中的默認(rèn)值來(lái)補(bǔ)充所缺少的實(shí)參。如:正確的帶缺省值函數(shù)的原型是:voidf_a(intx,inty=8,intz=9);

錯(cuò)誤的帶缺省值函數(shù)的原型是:voidf_a(intx=5,inty,intz=6);voidf_a(intx=5,inty=6,intz);注意:C++不允許在函數(shù)原型和函數(shù)定義中,同時(shí)指定默認(rèn)值。

面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第七十頁(yè),共八十四頁(yè),編輯于2023年,星期四5.8靜態(tài)成員函數(shù)

為了在不生成類(lèi)對(duì)象的情況下,直接訪問(wèn)靜態(tài)數(shù)據(jù)成員,C++定義了靜態(tài)成員函數(shù)的概念。定義靜態(tài)成員函數(shù)的格式如下: static返回值類(lèi)型成員函數(shù)名(參數(shù)列表);在靜態(tài)成員函數(shù)中所引用的數(shù)據(jù),可以是以下兩種類(lèi)型:⒈直接引用:類(lèi)中的靜態(tài)數(shù)據(jù)成員;全局?jǐn)?shù)據(jù)變量;用const關(guān)鍵字說(shuō)明的常量;面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第七十一頁(yè),共八十四頁(yè),編輯于2023年,星期四⒉間接引用:

類(lèi)中的非靜態(tài)數(shù)據(jù)成員,可以通過(guò)該類(lèi)的對(duì)象間接引用。如下例:intex=6;constintcx=7;classMyclass{public: staticintf_1(Myclassm);//靜態(tài)成員函數(shù) intx; //非靜態(tài)數(shù)據(jù)成員 staticinty;//靜態(tài)數(shù)據(jù)成員};intMyclass::y=8;intMyclass::f_1(Myclassm){ m.x=9; returny+ex+cx+m.x;}面向?qū)ο蟪绦蛟O(shè)計(jì)第二版函數(shù)的調(diào)用結(jié)果是:返回值=30

第七十二頁(yè),共八十四頁(yè),編輯于2023年,星期四訪問(wèn)靜態(tài)成員函數(shù)的方法有如下幾種:

方法⒈類(lèi)名::靜態(tài)成員函數(shù)名

方法⒉對(duì)象名.靜態(tài)成員函數(shù)名

方法⒊對(duì)象指針->靜態(tài)成員函數(shù)名面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第七十三頁(yè),共八十四頁(yè),編輯于2023年,星期四5.9函數(shù)的重載

所謂函數(shù)重載是指相同的函數(shù)名下,可以實(shí)現(xiàn)不同的操作。系統(tǒng)將根據(jù)參數(shù)類(lèi)型或者參數(shù)個(gè)數(shù)的不同來(lái)區(qū)分這些重載的函數(shù)。用戶在調(diào)用時(shí),只要給出不同類(lèi)型的參數(shù)或者不同個(gè)數(shù)的參數(shù)。編譯器就能區(qū)別你要調(diào)用哪個(gè)函數(shù)。函數(shù)重載的兩個(gè)條件: ⒈函數(shù)名相同; ⒉函數(shù)參數(shù)的類(lèi)型不同或者參數(shù)的個(gè)數(shù)不同。面向?qū)ο蟪绦蛟O(shè)計(jì)第二版第七十四頁(yè),共八十四頁(yè),編輯于2023年,星期四例如編寫(xiě)兩個(gè)數(shù)據(jù)相加的程序(其中這兩個(gè)數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論