




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第4章章 函數(shù)與預(yù)處理函數(shù)與預(yù)處理4.1 概述概述4.2 定義函數(shù)的一般形式定義函數(shù)的一般形式4.3 函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值4.4 函數(shù)的調(diào)用函數(shù)的調(diào)用*4.5 內(nèi)置函數(shù)內(nèi)置函數(shù)*4.6 函數(shù)的重載函數(shù)的重載*4.7 函數(shù)模板函數(shù)模板*4.8 有默認(rèn)參數(shù)的函數(shù)有默認(rèn)參數(shù)的函數(shù)4.9 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用4.10 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用4.11 局部變量和全局變量局部變量和全局變量4.12 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別4.13 變量屬性小結(jié)變量屬性小結(jié)4.14 關(guān)于變量的聲明和定義關(guān)于變量的聲明和定義4.15 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)4.16 預(yù)處理命令
2、預(yù)處理命令一個(gè)較大的程序不可能完全由一個(gè)人從頭至尾地完一個(gè)較大的程序不可能完全由一個(gè)人從頭至尾地完成,更不可能把所有的內(nèi)容都放在一個(gè)主函數(shù)中。成,更不可能把所有的內(nèi)容都放在一個(gè)主函數(shù)中。為了便于規(guī)劃、組織、編程和調(diào)試,一般的做法是為了便于規(guī)劃、組織、編程和調(diào)試,一般的做法是把一個(gè)大的程序劃分為若干個(gè)程序模塊把一個(gè)大的程序劃分為若干個(gè)程序模塊(即程序文即程序文件件),每一個(gè)模塊實(shí)現(xiàn)一部分功能。不同的程序模,每一個(gè)模塊實(shí)現(xiàn)一部分功能。不同的程序模塊可以由不同的人來(lái)完成。在程序進(jìn)行編譯時(shí),以塊可以由不同的人來(lái)完成。在程序進(jìn)行編譯時(shí),以程序模塊為編譯單位,即分別對(duì)每一個(gè)編譯單位進(jìn)程序模塊為編譯單位,即
3、分別對(duì)每一個(gè)編譯單位進(jìn)行編譯。如果發(fā)現(xiàn)錯(cuò)誤,可以在本程序模塊范圍內(nèi)行編譯。如果發(fā)現(xiàn)錯(cuò)誤,可以在本程序模塊范圍內(nèi)查錯(cuò)并改正。在分別通過(guò)編譯后,才進(jìn)行連接,把查錯(cuò)并改正。在分別通過(guò)編譯后,才進(jìn)行連接,把各模塊的目標(biāo)文件以及系統(tǒng)文件連接在一起形成可各模塊的目標(biāo)文件以及系統(tǒng)文件連接在一起形成可執(zhí)行文件。執(zhí)行文件。4.1 概述概述在一個(gè)程序文件中可以包含若干個(gè)函數(shù)。無(wú)論在一個(gè)程序文件中可以包含若干個(gè)函數(shù)。無(wú)論把一個(gè)程序劃分為多少個(gè)程序模塊,把一個(gè)程序劃分為多少個(gè)程序模塊,只能有一個(gè)只能有一個(gè)main函數(shù)函數(shù)。程序總是從程序總是從main函數(shù)開(kāi)始執(zhí)行的。函數(shù)開(kāi)始執(zhí)行的。在在程序運(yùn)行過(guò)程中,由主函數(shù)調(diào)用其他
4、函數(shù),其他函程序運(yùn)行過(guò)程中,由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。在數(shù)也可以互相調(diào)用。在C語(yǔ)言中沒(méi)有類(lèi)和對(duì)象,在語(yǔ)言中沒(méi)有類(lèi)和對(duì)象,在程序模塊中直接定義函數(shù)??梢哉J(rèn)為,一個(gè)程序模塊中直接定義函數(shù)??梢哉J(rèn)為,一個(gè)C程序程序是由若干個(gè)函數(shù)組成的,是由若干個(gè)函數(shù)組成的,C語(yǔ)言被認(rèn)為是面向函數(shù)語(yǔ)言被認(rèn)為是面向函數(shù)的語(yǔ)言。的語(yǔ)言。C+面向過(guò)程的程序設(shè)計(jì)沿用了面向過(guò)程的程序設(shè)計(jì)沿用了C語(yǔ)言使語(yǔ)言使用函數(shù)的方法。用函數(shù)的方法。在在C+面向?qū)ο蟮某绦蛟O(shè)計(jì)中,主函數(shù)以外的面向?qū)ο蟮某绦蛟O(shè)計(jì)中,主函數(shù)以外的函數(shù)大多是被封裝在類(lèi)中的。主函數(shù)或其他函數(shù)可函數(shù)大多是被封裝在類(lèi)中的。主函數(shù)或其他函數(shù)可以通過(guò)類(lèi)對(duì)象
5、調(diào)用類(lèi)中的函數(shù)。以通過(guò)類(lèi)對(duì)象調(diào)用類(lèi)中的函數(shù)。無(wú)論是無(wú)論是C還是還是C+,程序中的各項(xiàng)操作基本上都是由函數(shù)來(lái)實(shí)現(xiàn)的程序中的各項(xiàng)操作基本上都是由函數(shù)來(lái)實(shí)現(xiàn)的,程,程序編寫(xiě)者要根據(jù)需要編寫(xiě)一個(gè)個(gè)函數(shù),每個(gè)函數(shù)用序編寫(xiě)者要根據(jù)需要編寫(xiě)一個(gè)個(gè)函數(shù),每個(gè)函數(shù)用來(lái)實(shí)現(xiàn)某一功能。來(lái)實(shí)現(xiàn)某一功能?!昂瘮?shù)函數(shù)”這個(gè)名詞是從英文這個(gè)名詞是從英文function翻譯過(guò)來(lái)的,翻譯過(guò)來(lái)的,其實(shí)其實(shí)function的原意是的原意是“功能功能”。顧名思義,一個(gè)。顧名思義,一個(gè)函數(shù)就是一個(gè)功能。函數(shù)就是一個(gè)功能。在實(shí)際應(yīng)用的程序中,主函數(shù)寫(xiě)得很簡(jiǎn)單,它的作在實(shí)際應(yīng)用的程序中,主函數(shù)寫(xiě)得很簡(jiǎn)單,它的作用就是調(diào)用各個(gè)函數(shù),程序各部
6、分的功能全部都是用就是調(diào)用各個(gè)函數(shù),程序各部分的功能全部都是由各函數(shù)實(shí)現(xiàn)的。主函數(shù)相當(dāng)于總調(diào)度,調(diào)動(dòng)各函由各函數(shù)實(shí)現(xiàn)的。主函數(shù)相當(dāng)于總調(diào)度,調(diào)動(dòng)各函數(shù)依次實(shí)現(xiàn)各項(xiàng)功能。數(shù)依次實(shí)現(xiàn)各項(xiàng)功能。開(kāi)發(fā)商和軟件開(kāi)發(fā)人員將一些常用的功能模塊編寫(xiě)開(kāi)發(fā)商和軟件開(kāi)發(fā)人員將一些常用的功能模塊編寫(xiě)成函數(shù),放在成函數(shù),放在函數(shù)庫(kù)函數(shù)庫(kù)中供公共選用。程序開(kāi)發(fā)人員中供公共選用。程序開(kāi)發(fā)人員要善于利用庫(kù)函數(shù),以減少重復(fù)編寫(xiě)程序段的工作要善于利用庫(kù)函數(shù),以減少重復(fù)編寫(xiě)程序段的工作量。量。圖圖4.是一個(gè)程序中函數(shù)調(diào)用的示意圖。是一個(gè)程序中函數(shù)調(diào)用的示意圖。圖圖4.例例41 在主函數(shù)中調(diào)用其他函數(shù)。在主函數(shù)中調(diào)用其他函數(shù)。#in
7、clude using namespace std;void printstar(void) /定義定義printstar函數(shù)函數(shù) cout* endl; /輸出輸出30個(gè)個(gè)“*”void print_message(void) /定義定義print_message函數(shù)函數(shù) cout Welcome to C+!y?x:y; /將將x和和y中的大者的值賦給整型變量中的大者的值賦給整型變量zreturn (z); /將將z的值作為函數(shù)值返回調(diào)用點(diǎn)的值作為函數(shù)值返回調(diào)用點(diǎn)C+要求在定義函數(shù)時(shí)必須指定函數(shù)的類(lèi)型。要求在定義函數(shù)時(shí)必須指定函數(shù)的類(lèi)型。4.2.2 定義有參函數(shù)的一般形式定義有參函數(shù)的一般
8、形式在調(diào)用函數(shù)時(shí),大多數(shù)情況下,函數(shù)是帶參數(shù)的。在調(diào)用函數(shù)時(shí),大多數(shù)情況下,函數(shù)是帶參數(shù)的。主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。前面主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。前面已提到:在定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名已提到:在定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名稱(chēng)為形式參數(shù)(稱(chēng)為形式參數(shù)(formal parameter,簡(jiǎn)稱(chēng)簡(jiǎn)稱(chēng)形參形參),),在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)的參數(shù)(可以是一個(gè)表達(dá)式可以是一個(gè)表達(dá)式)稱(chēng)為實(shí)際參數(shù)(稱(chēng)為實(shí)際參數(shù)(actual parameter,簡(jiǎn)稱(chēng)簡(jiǎn)稱(chēng)實(shí)參實(shí)參)。)。4.3 函數(shù)參數(shù)和函數(shù)的
9、值函數(shù)參數(shù)和函數(shù)的值 4.3.1 形式參數(shù)和實(shí)際參數(shù)形式參數(shù)和實(shí)際參數(shù)int max(int x,int y) int z; if(xy) z=x; else z=y; return(z); int main( ) int a,b,m; cinab; m=max(a,b); f(x,y) = x + yf(1,2) 1+2定義形式參數(shù)調(diào)用實(shí)際參數(shù)例例4.2 調(diào)用函數(shù)時(shí)的數(shù)據(jù)傳遞。調(diào)用函數(shù)時(shí)的數(shù)據(jù)傳遞。#include using namespace std;int max(int x,int y) /定義有參函數(shù)定義有參函數(shù)maxint z; z=xy?x:y; return(z); int
10、main( )int a,b,c; coutab; c=max(a,b); /調(diào)用調(diào)用max函數(shù),給定實(shí)參為函數(shù),給定實(shí)參為a,b。函數(shù)值賦給函數(shù)值賦給c coutmax=cy?x:y; return(z); int main( )int a,b,c; coutab; c=max(a,b); coutmax=cendl; return 0; 3x返回地址調(diào)用者狀態(tài)4c4b3a返回地址OS狀態(tài)4ymain( )max( )4z注意箭頭的方向注意箭頭的方向運(yùn)行情況如下:運(yùn)行情況如下:please enter two integer numbers:2 3 max=3圖圖4.2有關(guān)形參與實(shí)參的說(shuō)明:
11、有關(guān)形參與實(shí)參的說(shuō)明:(1) 在定義函數(shù)時(shí)指定的形參,在未出現(xiàn)函數(shù)調(diào)用在定義函數(shù)時(shí)指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元,因此稱(chēng)它們是時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元,因此稱(chēng)它們是形式參數(shù)或虛擬參數(shù)形式參數(shù)或虛擬參數(shù),表示它們并不是實(shí)際存在的,表示它們并不是實(shí)際存在的數(shù)據(jù),只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)數(shù)據(jù),只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max中的形參中的形參才被分配內(nèi)存單元,以便接收從實(shí)參傳來(lái)的數(shù)據(jù)。才被分配內(nèi)存單元,以便接收從實(shí)參傳來(lái)的數(shù)據(jù)。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。(2) 實(shí)參可以是常量、變量或表達(dá)式,如實(shí)參可以是常量、
12、變量或表達(dá)式,如max(3, a+b);但要求但要求a和和b有確定的值。以便在調(diào)用函數(shù)時(shí)有確定的值。以便在調(diào)用函數(shù)時(shí)將實(shí)參的值賦給形參。將實(shí)參的值賦給形參。(3) 在定義函數(shù)時(shí),必須在函數(shù)首部指定形參的類(lèi)在定義函數(shù)時(shí),必須在函數(shù)首部指定形參的類(lèi)型(見(jiàn)例型(見(jiàn)例4.2程序第程序第3行)。行)。(4) 實(shí)參與形參的實(shí)參與形參的類(lèi)型應(yīng)相同或賦值兼容類(lèi)型應(yīng)相同或賦值兼容。例。例4.2中中實(shí)參和形參都是整型,這是合法的、正確的。如果實(shí)參和形參都是整型,這是合法的、正確的。如果實(shí)參為整型而形參為實(shí)型,或者相反,則按不同類(lèi)實(shí)參為整型而形參為實(shí)型,或者相反,則按不同類(lèi)型數(shù)值的賦值規(guī)則進(jìn)行轉(zhuǎn)換。例如實(shí)參型數(shù)值的
13、賦值規(guī)則進(jìn)行轉(zhuǎn)換。例如實(shí)參a的值為的值為3.5,而形參而形參x為整型,則將為整型,則將3.5轉(zhuǎn)換成整數(shù)轉(zhuǎn)換成整數(shù)3,然后送到,然后送到形參形參b。字符型與整型可以互相通用。字符型與整型可以互相通用。(5) 實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞是實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞是“值傳遞值傳遞”,即單向傳遞,即單向傳遞,只能由實(shí)參傳給形參,而不能由形參只能由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參傳回來(lái)給實(shí)參。在調(diào)用函數(shù)時(shí),編譯系統(tǒng)臨時(shí)給形。在調(diào)用函數(shù)時(shí),編譯系統(tǒng)臨時(shí)給形參分配存儲(chǔ)單元。請(qǐng)注意:參分配存儲(chǔ)單元。請(qǐng)注意: 實(shí)參單元與形參單元實(shí)參單元與形參單元是不同的單元。圖是不同的單元。圖4.3表示將實(shí)參和的值
14、表示將實(shí)參和的值2和和3傳遞給對(duì)應(yīng)的形參和。傳遞給對(duì)應(yīng)的形參和。 圖圖4.3 圖圖4.4調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參維持原值。因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果發(fā)生改變,并不會(huì)改變主調(diào)函數(shù)中實(shí)參的的值如果發(fā)生改變,并不會(huì)改變主調(diào)函數(shù)中實(shí)參的值。例如,若在執(zhí)行值。例如,若在執(zhí)行max函數(shù)過(guò)程中形參和的函數(shù)過(guò)程中形參和的值變?yōu)橹底優(yōu)?0和和15,調(diào)用結(jié)束后,實(shí)參和仍為,調(diào)用結(jié)束后,實(shí)參和仍為2和和3,見(jiàn)圖見(jiàn)圖4.4。函數(shù)調(diào)用時(shí)內(nèi)存空間分配情況void funcA(int,int);voi
15、d funcB(int);void main( )int a=6, b=12;funcA(a,b);void funcA(int aa, int bb)int n=5;funcB(n);void funcB(int s)int x;函數(shù)調(diào)用返回main()時(shí)內(nèi)存空間分配情況(1) 函數(shù)的返回值是通過(guò)函數(shù)中的函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句獲得語(yǔ)句獲得的。的。return語(yǔ)句將被調(diào)用函數(shù)中的一個(gè)確定值帶回語(yǔ)句將被調(diào)用函數(shù)中的一個(gè)確定值帶回主調(diào)函數(shù)中去。主調(diào)函數(shù)中去。return語(yǔ)句后面的括號(hào)可以要,也可以不要。語(yǔ)句后面的括號(hào)可以要,也可以不要。return后面可以是一個(gè)表達(dá)式。后面可以
16、是一個(gè)表達(dá)式。(2) 函數(shù)值的類(lèi)型。既然函數(shù)有返回值,這個(gè)值當(dāng)函數(shù)值的類(lèi)型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一個(gè)確定的類(lèi)型,應(yīng)當(dāng)在定義函數(shù)時(shí)指然應(yīng)屬于某一個(gè)確定的類(lèi)型,應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值的類(lèi)型。定函數(shù)值的類(lèi)型。(3) 如果函數(shù)值的類(lèi)型和如果函數(shù)值的類(lèi)型和return語(yǔ)句中表達(dá)式的值語(yǔ)句中表達(dá)式的值不一致,則以函數(shù)類(lèi)型為準(zhǔn),即函數(shù)類(lèi)型決定返回不一致,則以函數(shù)類(lèi)型為準(zhǔn),即函數(shù)類(lèi)型決定返回值的類(lèi)型。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。值的類(lèi)型。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。4.3.2 函數(shù)的返回值函數(shù)的返回值#include using namespace std;int max(
17、int x,int y) /定義有參函數(shù)定義有參函數(shù)maxint z; z=xy?x:y; return(z); int main( )int a,b,c; coutab; c=max(a,b); /調(diào)用調(diào)用max函數(shù),給定實(shí)參為函數(shù),給定實(shí)參為a,b。函數(shù)值賦給函數(shù)值賦給c coutmax=cy?x:y; return(z); int main( )int a,b,c; coutab; c=max(a,b); coutmax=cendl; return 0; 3x返回地址調(diào)用者狀態(tài)4c4b3a返回地址OS狀態(tài)4ymain( )max( )4z注意箭頭的方向注意箭頭的方向按函數(shù)在語(yǔ)句中的作用來(lái)
18、分,可以有以下按函數(shù)在語(yǔ)句中的作用來(lái)分,可以有以下3種函數(shù)種函數(shù)調(diào)用方式:調(diào)用方式:. 函數(shù)語(yǔ)句函數(shù)語(yǔ)句把函數(shù)調(diào)用單獨(dú)作為一個(gè)語(yǔ)句,并不要求函數(shù)帶回把函數(shù)調(diào)用單獨(dú)作為一個(gè)語(yǔ)句,并不要求函數(shù)帶回一個(gè)值,只是要求函數(shù)完成一定的操作。如例一個(gè)值,只是要求函數(shù)完成一定的操作。如例4.1中的中的printstar( );2. 函數(shù)表達(dá)式函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)要求函數(shù)帶回一個(gè)函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。如確定的值以參加表達(dá)式的運(yùn)算。如c=2*max(a,b);4.4.2 函數(shù)調(diào)用的方式函數(shù)調(diào)用的方式3. 函數(shù)參數(shù)函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參
19、。如函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。如m=max(a, max(b,c) ); /max(b,c)是函數(shù)調(diào)用,其值作為外層是函數(shù)調(diào)用,其值作為外層max函數(shù)調(diào)用的函數(shù)調(diào)用的 /一個(gè)實(shí)參一個(gè)實(shí)參4.4.2 函數(shù)調(diào)用的方式函數(shù)調(diào)用的方式在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)(即被調(diào)用函數(shù))需在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?要具備哪些條件呢?(1) 首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)。首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)。(2) 如果使用庫(kù)函數(shù),一般還應(yīng)該在本文件開(kāi)頭用如果使用庫(kù)函數(shù),一般還應(yīng)該在本文件開(kāi)頭用include命令將有關(guān)頭文件命令將有關(guān)頭文件“包含包含”到本文件中來(lái)。到本
20、文件中來(lái)。4.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型(3) 如果使用用戶(hù)自己定義的函數(shù),而該函數(shù)與調(diào)如果使用用戶(hù)自己定義的函數(shù),而該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)程序單位中用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)程序單位中,且位置在主調(diào)函數(shù)之后,則必須在調(diào)用此函數(shù)之前且位置在主調(diào)函數(shù)之后,則必須在調(diào)用此函數(shù)之前對(duì)被調(diào)用的函數(shù)作聲明對(duì)被調(diào)用的函數(shù)作聲明。所謂函數(shù)聲明所謂函數(shù)聲明(declare),就是在函數(shù)尚在未定義的就是在函數(shù)尚在未定義的情況下,事先將該函數(shù)的有關(guān)信息通知編譯系統(tǒng),情況下,事先將該函數(shù)的有關(guān)信息通知編譯系統(tǒng),以便使編譯能正常進(jìn)行。以便使編譯能正常進(jìn)行
21、。4.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型總結(jié):總結(jié):先定義后使用;先定義后使用;若要先使用后定義,則在使用前先聲明若要先使用后定義,則在使用前先聲明。4.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型例例4.3 對(duì)被調(diào)用的函數(shù)作聲明。對(duì)被調(diào)用的函數(shù)作聲明。#include using namespace std;float add(float x,float y) /定義定義add函數(shù)函數(shù)float z; z=x+y; return (z); int main( ) float a,b,c;coutab; c=add(a,b); coutsum=
22、cendl; return 0; 例例4.3 對(duì)被調(diào)用的函數(shù)作聲明。對(duì)被調(diào)用的函數(shù)作聲明。#include using namespace std;int main( )float add(float x,float y); /對(duì)對(duì)add函數(shù)函數(shù)作聲明作聲明 float a,b,c;coutab; c=add(a,b); coutsum=cy?x:y; return(z); int main( )int a,b,c; coutab; c=max(a,b); coutmax=cendl; return 0; 3x返回地址調(diào)用者狀態(tài)4c4b3a返回地址OS狀態(tài)4ymain( )max( )4z注意
23、箭頭的方向注意箭頭的方向例例4.3 對(duì)被調(diào)用的函數(shù)作聲明。對(duì)被調(diào)用的函數(shù)作聲明。#include using namespace std;int main( )float add(float x,float y); /對(duì)對(duì)add函數(shù)作聲明函數(shù)作聲明 float a,b,c;coutab; c=add(a,b); coutsum=cendl; return 0; float add(float x,float y) /定義定義add函數(shù)函數(shù)float z; z=x+y; return (z); C+提供一種提高效率的方法,即在編譯時(shí)將所調(diào)提供一種提高效率的方法,即在編譯時(shí)將所調(diào)用函數(shù)的代碼直接嵌
24、入到主調(diào)函數(shù)中,而不是將流用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去。這種嵌入到主調(diào)函數(shù)中的函數(shù)稱(chēng)為程轉(zhuǎn)出去。這種嵌入到主調(diào)函數(shù)中的函數(shù)稱(chēng)為內(nèi)置內(nèi)置函數(shù)函數(shù)(inline function),又稱(chēng)又稱(chēng)內(nèi)嵌函數(shù)內(nèi)嵌函數(shù)。在有些書(shū)中。在有些書(shū)中把它譯成把它譯成內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)。指定內(nèi)置函數(shù)的方法很簡(jiǎn)單,只需在函數(shù)首行的左指定內(nèi)置函數(shù)的方法很簡(jiǎn)單,只需在函數(shù)首行的左端加一個(gè)關(guān)鍵字端加一個(gè)關(guān)鍵字inline即可。即可。例例4.4 函數(shù)指定為內(nèi)置函數(shù)。函數(shù)指定為內(nèi)置函數(shù)。#include using namespace std;inline int max(int,int, int); /聲明
25、函數(shù),注意左端有聲明函數(shù),注意左端有inlineint main( )int i=10,j=20,k=30,m; m=max(i,j,k); coutmax=ma) a=b; /求求a,b,c中的最大者中的最大者 if(ca) a=c; return a; #include using namespace std;inline int max(int,int, int); /聲明函數(shù),注意左端有聲明函數(shù),注意左端有inlineint main( )int i=10,j=20,k=30, m;if (ji) i=j;/ m=max(i,j,k);if(ki) i=k;m=i; coutmax=m
26、a) a=b; /求求a,b,c中的最大者中的最大者 if(ca) a=c; return a;由于在定義函數(shù)時(shí)指定它為內(nèi)置函數(shù),因此編譯系由于在定義函數(shù)時(shí)指定它為內(nèi)置函數(shù),因此編譯系統(tǒng)在遇到函數(shù)調(diào)用統(tǒng)在遇到函數(shù)調(diào)用“max(i,j,k)”時(shí),就用時(shí),就用max函數(shù)函數(shù)體的代碼體的代碼代替代替“max(i,j,k)”,同時(shí)將實(shí)參代替形參同時(shí)將實(shí)參代替形參。這樣,程序第這樣,程序第6行行 “m=max(i,j,k);”就被置換成就被置換成if (ji) i=j;if(ki) i=k;m=i;一般只將規(guī)模很小一般只將規(guī)模很小(一般為一般為5個(gè)語(yǔ)句以下個(gè)語(yǔ)句以下)而使用頻而使用頻繁的函數(shù)繁的函數(shù)(如
27、定時(shí)采集數(shù)據(jù)的函數(shù)如定時(shí)采集數(shù)據(jù)的函數(shù))聲明為內(nèi)置函數(shù)。聲明為內(nèi)置函數(shù)。內(nèi)置函數(shù)中內(nèi)置函數(shù)中不能包括復(fù)雜的控制語(yǔ)句不能包括復(fù)雜的控制語(yǔ)句,如循環(huán)語(yǔ)句,如循環(huán)語(yǔ)句和和switch語(yǔ)句。語(yǔ)句。說(shuō)明說(shuō)明: 對(duì)函數(shù)作對(duì)函數(shù)作inline聲明,只是程序設(shè)計(jì)者對(duì)編聲明,只是程序設(shè)計(jì)者對(duì)編譯系統(tǒng)提出的一個(gè)建議,也就是說(shuō)它是建議性的,譯系統(tǒng)提出的一個(gè)建議,也就是說(shuō)它是建議性的,而不是指令性的。并非一經(jīng)指定為而不是指令性的。并非一經(jīng)指定為inline,編譯系編譯系統(tǒng)就必須這樣做。編譯系統(tǒng)會(huì)根據(jù)具體情況決定是統(tǒng)就必須這樣做。編譯系統(tǒng)會(huì)根據(jù)具體情況決定是否這樣做。否這樣做。在編程時(shí),有時(shí)我們要實(shí)現(xiàn)的是在編程時(shí),有時(shí)
28、我們要實(shí)現(xiàn)的是同一類(lèi)的功能同一類(lèi)的功能,只,只是有些細(xì)節(jié)不同。例如希望從是有些細(xì)節(jié)不同。例如希望從3個(gè)數(shù)中找出其中的個(gè)數(shù)中找出其中的最大者,而每次求最大數(shù)時(shí)數(shù)據(jù)的類(lèi)型不同,可能最大者,而每次求最大數(shù)時(shí)數(shù)據(jù)的類(lèi)型不同,可能是是3個(gè)個(gè)整數(shù)整數(shù)、3個(gè)個(gè)雙精度數(shù)雙精度數(shù)或或3個(gè)個(gè)長(zhǎng)整數(shù)長(zhǎng)整數(shù)。程序設(shè)計(jì)。程序設(shè)計(jì)者往往會(huì)分別設(shè)計(jì)出者往往會(huì)分別設(shè)計(jì)出3個(gè)不同名的函數(shù),其函數(shù)原個(gè)不同名的函數(shù),其函數(shù)原型為:型為:int max1(int a,int b, int c); /求求3個(gè)整數(shù)中的最大者個(gè)整數(shù)中的最大者double max2(double a,double b,double c); /求求3個(gè)雙精度
29、數(shù)中最大者個(gè)雙精度數(shù)中最大者long max3(long a,long b,long c); /求求3個(gè)長(zhǎng)整數(shù)中的最大者個(gè)長(zhǎng)整數(shù)中的最大者C+允許用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的允許用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)個(gè)數(shù)和參數(shù)類(lèi)型不同。這就是函數(shù)的重載參數(shù)個(gè)數(shù)和參數(shù)類(lèi)型不同。這就是函數(shù)的重載(function overloading)。即對(duì)一個(gè)函數(shù)名重新賦予即對(duì)一個(gè)函數(shù)名重新賦予它新的含義,使一個(gè)它新的含義,使一個(gè)函數(shù)名可以多用函數(shù)名可以多用。*4.6 函數(shù)的重載函數(shù)的重載對(duì)上面求最大數(shù)的問(wèn)題可以編寫(xiě)如下的對(duì)上面求最大數(shù)的問(wèn)題可以編寫(xiě)如下的C+程序。程序。例例4.5 求求3個(gè)數(shù)中最大
30、的數(shù)(分別考慮整數(shù)、雙精度個(gè)數(shù)中最大的數(shù)(分別考慮整數(shù)、雙精度數(shù)、長(zhǎng)整數(shù)的情況)。數(shù)、長(zhǎng)整數(shù)的情況)。#include using namespace std;int main( )int max(int a,int b,int c); /函數(shù)聲明函數(shù)聲明double max(double a,double b,double c); /函數(shù)聲明函數(shù)聲明long max(long a,long b,long c); /函數(shù)聲明函數(shù)聲明 int i1,i2,i3,i; cini1i2i3; /輸入輸入3個(gè)整數(shù)個(gè)整數(shù) i=max(i1,i2,i3); /求求3個(gè)整數(shù)中的最大者個(gè)整數(shù)中的最大者 cou
31、ti_max=id1d2d3; /輸入輸入3個(gè)雙精度數(shù)個(gè)雙精度數(shù) d=max(d1,d2,d3); /求求3個(gè)雙精度數(shù)中的最大者個(gè)雙精度數(shù)中的最大者 coutd_max=dg1g2g3; /輸入輸入3個(gè)長(zhǎng)整數(shù)個(gè)長(zhǎng)整數(shù) g=max(g1,g2,g3); /求求3個(gè)長(zhǎng)整數(shù)中的最大者個(gè)長(zhǎng)整數(shù)中的最大者 coutg_max=ga) a=b; if(ca) a=c; return a; double max(double a,double b,double c) /定義求定義求3個(gè)雙精度數(shù)中的最大者的函數(shù)個(gè)雙精度數(shù)中的最大者的函數(shù)if(ba) a=b; if(ca) a=c; return a; lon
32、g max(long a,long b,long c) /定義求定義求3個(gè)長(zhǎng)整數(shù)中的最大者的函數(shù)個(gè)長(zhǎng)整數(shù)中的最大者的函數(shù)if(ba) a=b; if(ca) a=c; return a; 運(yùn)行情況如下:運(yùn)行情況如下:185 -76 567 (輸入輸入3個(gè)整數(shù)個(gè)整數(shù))56.87 90.23 -3214.78 (輸入輸入3個(gè)實(shí)數(shù)個(gè)實(shí)數(shù))67854 -912456 673456 (輸入輸入3個(gè)長(zhǎng)整數(shù)個(gè)長(zhǎng)整數(shù))i_max=567 (輸出輸出3個(gè)整數(shù)的最大值)個(gè)整數(shù)的最大值)d_max=90.23 (輸出輸出3個(gè)雙精度數(shù)的最大值)個(gè)雙精度數(shù)的最大值)g_max=673456 (輸出輸出3個(gè)長(zhǎng)整數(shù)的最大值
33、)個(gè)長(zhǎng)整數(shù)的最大值)上例上例3個(gè)個(gè)max函數(shù)的函數(shù)體是相同的,其實(shí)重載函函數(shù)的函數(shù)體是相同的,其實(shí)重載函數(shù)數(shù)并不要求函數(shù)體相同并不要求函數(shù)體相同。重載函數(shù)除了允許參數(shù)類(lèi)。重載函數(shù)除了允許參數(shù)類(lèi)型不同以外,還允許型不同以外,還允許參數(shù)的個(gè)數(shù)不同參數(shù)的個(gè)數(shù)不同。例例4.6 編寫(xiě)一個(gè)程序,用來(lái)求兩個(gè)整數(shù)或編寫(xiě)一個(gè)程序,用來(lái)求兩個(gè)整數(shù)或3個(gè)整數(shù)中個(gè)整數(shù)中的最大數(shù)。如果輸入兩個(gè)整數(shù),程序就輸出這兩個(gè)的最大數(shù)。如果輸入兩個(gè)整數(shù),程序就輸出這兩個(gè)整數(shù)中的最大數(shù),如果輸入整數(shù)中的最大數(shù),如果輸入3個(gè)整數(shù),程序就輸出個(gè)整數(shù),程序就輸出這這3個(gè)整數(shù)中的最大數(shù)。個(gè)整數(shù)中的最大數(shù)。#include using nam
34、espace std;int main( )int max(int a,int b,int c); /函數(shù)聲明函數(shù)聲明 int max(int a,int b); /函數(shù)聲明函數(shù)聲明 int a=8,b=-12,c=27; coutmax(a,b,c)=max(a,b,c)endl; /輸出輸出3個(gè)整數(shù)中的最大者個(gè)整數(shù)中的最大者 coutmax(a,b)=max(a,b)a) a=b; if(ca) a=c; return a;int max(int a,int b) /此此max函數(shù)的作用是求兩個(gè)整數(shù)中的最大者函數(shù)的作用是求兩個(gè)整數(shù)中的最大者if(ab) return a;else retu
35、rn b;運(yùn)行情況如下:運(yùn)行情況如下:max(a,b,c)=27max(a,b)=8兩次調(diào)用兩次調(diào)用max函數(shù)的參數(shù)個(gè)數(shù)不同,系統(tǒng)就根據(jù)參函數(shù)的參數(shù)個(gè)數(shù)不同,系統(tǒng)就根據(jù)參數(shù)的個(gè)數(shù)找到與之匹配的函數(shù)并調(diào)用它。數(shù)的個(gè)數(shù)找到與之匹配的函數(shù)并調(diào)用它。參數(shù)的個(gè)數(shù)和類(lèi)型可以都不同。但不能只有函數(shù)的參數(shù)的個(gè)數(shù)和類(lèi)型可以都不同。但不能只有函數(shù)的類(lèi)型不同而參數(shù)的個(gè)數(shù)和類(lèi)型相同。例如:類(lèi)型不同而參數(shù)的個(gè)數(shù)和類(lèi)型相同。例如:int f(int); /函數(shù)返回值為整型函數(shù)返回值為整型long f(int); /函數(shù)返回值為長(zhǎng)整型函數(shù)返回值為長(zhǎng)整型void f(int); /函數(shù)無(wú)返回值函數(shù)無(wú)返回值在函數(shù)調(diào)用時(shí)都是同一
36、形式,如在函數(shù)調(diào)用時(shí)都是同一形式,如“f(10)”。編譯系編譯系統(tǒng)無(wú)法判別應(yīng)該調(diào)用哪一個(gè)函數(shù)。統(tǒng)無(wú)法判別應(yīng)該調(diào)用哪一個(gè)函數(shù)。在使用重載函數(shù)時(shí),同名函數(shù)的功能應(yīng)當(dāng)相同或相在使用重載函數(shù)時(shí),同名函數(shù)的功能應(yīng)當(dāng)相同或相近,不要用同一函數(shù)名去實(shí)現(xiàn)完全不相干的功能,近,不要用同一函數(shù)名去實(shí)現(xiàn)完全不相干的功能,雖然程序也能運(yùn)行,但可讀性不好,使人莫名其妙。雖然程序也能運(yùn)行,但可讀性不好,使人莫名其妙。注意:注意:重載函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型或參數(shù)順序重載函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型或參數(shù)順序3者中必須至少有者中必須至少有一種不同,一種不同,函數(shù)返回值類(lèi)型可以相同也可以不同。函數(shù)返回值類(lèi)型可以相同也可以不同。
37、i = max(i1,i2,i3); /求求3個(gè)整數(shù)中的最大者個(gè)整數(shù)中的最大者d = max(d1,d2,d3); /求求3個(gè)雙精度數(shù)中的最大者個(gè)雙精度數(shù)中的最大者g = max(g1,g2,g3); /求求3個(gè)長(zhǎng)整數(shù)中的最大者個(gè)長(zhǎng)整數(shù)中的最大者max(a,b,c);max(a,b);int max(int a,int b,int c) /定義求定義求3個(gè)整數(shù)中的最大者的函數(shù)個(gè)整數(shù)中的最大者的函數(shù)if(ba) a=b; if(ca) a=c; return a; double max(double a,double b,double c) /定義求定義求3個(gè)雙精度數(shù)中的最大者的函數(shù)個(gè)雙精度數(shù)中
38、的最大者的函數(shù)if(ba) a=b; if(ca) a=c; return a; long max(long a,long b,long c) /定義求定義求3個(gè)長(zhǎng)整數(shù)中的最大者的函數(shù)個(gè)長(zhǎng)整數(shù)中的最大者的函數(shù)if(ba) a=b; if(ca) a=c; return a; int max(int a,int b,int c) /此此max函數(shù)的作用是求函數(shù)的作用是求3個(gè)整數(shù)中的最大者個(gè)整數(shù)中的最大者if(ba) a=b; if(ca) a=c; return a;int max(int a,int b) /此此max函數(shù)的作用是求兩個(gè)整數(shù)中的最大者函數(shù)的作用是求兩個(gè)整數(shù)中的最大者if(ab)
39、 return a;else return b;C+提供了函數(shù)模板提供了函數(shù)模板(function template)。所謂函數(shù)所謂函數(shù)模板,實(shí)際上是建立一個(gè)模板,實(shí)際上是建立一個(gè)通用函數(shù)通用函數(shù),其函數(shù)類(lèi)型和,其函數(shù)類(lèi)型和形參類(lèi)型不具體指定,用一個(gè)虛擬的類(lèi)型來(lái)代表。形參類(lèi)型不具體指定,用一個(gè)虛擬的類(lèi)型來(lái)代表。這個(gè)通用函數(shù)就稱(chēng)為函數(shù)模板。這個(gè)通用函數(shù)就稱(chēng)為函數(shù)模板。凡是函數(shù)體相同的凡是函數(shù)體相同的函數(shù)都可以用這個(gè)模板來(lái)代替函數(shù)都可以用這個(gè)模板來(lái)代替,不必定義多個(gè)函數(shù),不必定義多個(gè)函數(shù),只需在模板中定義一次即可。在調(diào)用函數(shù)時(shí)系統(tǒng)會(huì)只需在模板中定義一次即可。在調(diào)用函數(shù)時(shí)系統(tǒng)會(huì)根據(jù)實(shí)參的類(lèi)型來(lái)取代模
40、板中的虛擬類(lèi)型,從而實(shí)根據(jù)實(shí)參的類(lèi)型來(lái)取代模板中的虛擬類(lèi)型,從而實(shí)現(xiàn)了不同函數(shù)的功能??聪旅娴睦泳颓宄恕,F(xiàn)了不同函數(shù)的功能。看下面的例子就清楚了。例例4.7 將例將例4.6程序改為通過(guò)函數(shù)模板來(lái)實(shí)現(xiàn)。程序改為通過(guò)函數(shù)模板來(lái)實(shí)現(xiàn)。*4.7 函數(shù)模板函數(shù)模板#include using namespace std;template /模板聲明,其中模板聲明,其中T為為類(lèi)型參數(shù)類(lèi)型參數(shù)T max(T a,T b,T c) /定義一個(gè)通用函數(shù),用定義一個(gè)通用函數(shù),用T作虛擬的類(lèi)型名作虛擬的類(lèi)型名if(ba) a=b; if(ca) a=c; return a;int main( )int i1=1
41、85, i2=-76, i3=567,i; double d1=56.87, d2=90.23, d3=-3214.78,d; long g1=67854, g2=-912456, g3=673456,g; i= max(i1,i2,i3); /調(diào)用模板函數(shù),此時(shí)調(diào)用模板函數(shù),此時(shí)T被被int取代取代 d=max(d1,d2,d3); /調(diào)用模板函數(shù),此時(shí)調(diào)用模板函數(shù),此時(shí)T被被double取代取代 g=max(g1,g2,g3); /調(diào)用模板函數(shù),此時(shí)調(diào)用模板函數(shù),此時(shí)T被被long取代取代 couti_max=iendl; coutf_max=fendl; coutg_max=gendl;
42、 return 0;運(yùn)行結(jié)果與例運(yùn)行結(jié)果與例4.5相同。為了節(jié)省篇幅,數(shù)據(jù)不用相同。為了節(jié)省篇幅,數(shù)據(jù)不用cin語(yǔ)句輸入,而在變量定義時(shí)初始化。語(yǔ)句輸入,而在變量定義時(shí)初始化。程序第程序第38行是定義模板。定義函數(shù)模板的一般形行是定義模板。定義函數(shù)模板的一般形式為式為 template 或或 template 通用函數(shù)定義通用函數(shù)定義 通用函數(shù)定義通用函數(shù)定義在建立函數(shù)模板時(shí),只要將例在建立函數(shù)模板時(shí),只要將例4.5程序中定義的第程序中定義的第一個(gè)函數(shù)首部的一個(gè)函數(shù)首部的int改為改為T(mén)即可。即用即可。即用虛擬的類(lèi)型名虛擬的類(lèi)型名T代替具體的數(shù)據(jù)類(lèi)型。在對(duì)程序進(jìn)行編譯時(shí),遇代替具體的數(shù)據(jù)類(lèi)型。
43、在對(duì)程序進(jìn)行編譯時(shí),遇到第到第13行調(diào)用函數(shù)行調(diào)用函數(shù)max(i1,i2,i3),編譯系統(tǒng)會(huì)將函編譯系統(tǒng)會(huì)將函數(shù)名數(shù)名max與模板與模板max相匹配,將實(shí)參的類(lèi)型取代了相匹配,將實(shí)參的類(lèi)型取代了函數(shù)模板中的虛擬類(lèi)型函數(shù)模板中的虛擬類(lèi)型T。此時(shí)相當(dāng)于已定義了一此時(shí)相當(dāng)于已定義了一個(gè)函數(shù):個(gè)函數(shù):int max(int a,int b,int c)if(ba) a=b; if(ca) a=c; return a;然后調(diào)用它。后面兩行然后調(diào)用它。后面兩行(14,15行行)的情況類(lèi)似。的情況類(lèi)似。類(lèi)型參數(shù)可以不只一個(gè),可以根據(jù)需要確定個(gè)數(shù)。類(lèi)型參數(shù)可以不只一個(gè),可以根據(jù)需要確定個(gè)數(shù)。如如templat
44、e 可以看到,用函數(shù)模板比函數(shù)重載更方便,程序更可以看到,用函數(shù)模板比函數(shù)重載更方便,程序更簡(jiǎn)潔。簡(jiǎn)潔。但應(yīng)注意它只適用于函數(shù)的參數(shù)個(gè)數(shù)相同而但應(yīng)注意它只適用于函數(shù)的參數(shù)個(gè)數(shù)相同而類(lèi)型不同,且函數(shù)體相同的情況,類(lèi)型不同,且函數(shù)體相同的情況,如果參數(shù)的個(gè)數(shù)如果參數(shù)的個(gè)數(shù)不同,則不能用函數(shù)模板。不同,則不能用函數(shù)模板。一般情況下,在函數(shù)調(diào)用時(shí)形參從實(shí)參那里取得值,一般情況下,在函數(shù)調(diào)用時(shí)形參從實(shí)參那里取得值,因此實(shí)參的個(gè)數(shù)應(yīng)與形參相同。有時(shí)多次調(diào)用同一因此實(shí)參的個(gè)數(shù)應(yīng)與形參相同。有時(shí)多次調(diào)用同一函數(shù)時(shí)用同樣的實(shí)參,函數(shù)時(shí)用同樣的實(shí)參,C+提供簡(jiǎn)單的處理辦法,提供簡(jiǎn)單的處理辦法,給形參一個(gè)默認(rèn)值,這
45、樣形參就不必一定要從實(shí)參給形參一個(gè)默認(rèn)值,這樣形參就不必一定要從實(shí)參取值了。取值了。*4.8 有默認(rèn)參數(shù)的函數(shù)有默認(rèn)參數(shù)的函數(shù)如有一函數(shù)聲明如有一函數(shù)聲明float area(float r=6.5);指定指定r的默認(rèn)值為的默認(rèn)值為6.5,如果在調(diào)用此函數(shù)時(shí),確認(rèn),如果在調(diào)用此函數(shù)時(shí),確認(rèn)r的值為的值為6.5,則可以不必給出實(shí)參的值,如,則可以不必給出實(shí)參的值,如area( ); /相當(dāng)于相當(dāng)于area(6.5);如果不想使形參取此默認(rèn)值,則通過(guò)實(shí)參另行給出。如果不想使形參取此默認(rèn)值,則通過(guò)實(shí)參另行給出。如如area(7.5); /形參得到的值為形參得到的值為7.5,而不是,而不是6.5這種方
46、法比較靈活,可以簡(jiǎn)化編程,提高運(yùn)行效率。這種方法比較靈活,可以簡(jiǎn)化編程,提高運(yùn)行效率。*4.8 有默認(rèn)參數(shù)的函數(shù)有默認(rèn)參數(shù)的函數(shù)如果有多個(gè)形參,可以使每個(gè)形參有一個(gè)默認(rèn)值,也如果有多個(gè)形參,可以使每個(gè)形參有一個(gè)默認(rèn)值,也可以只對(duì)一部分形參指定默認(rèn)值,另一部分形參不指可以只對(duì)一部分形參指定默認(rèn)值,另一部分形參不指定默認(rèn)值。定默認(rèn)值。如有一個(gè)求圓柱體體積的函數(shù),形參如有一個(gè)求圓柱體體積的函數(shù),形參h代表圓柱體的高,代表圓柱體的高,r為圓柱體半徑。函數(shù)原型如下:為圓柱體半徑。函數(shù)原型如下:float volume(float h, float r=12.5); /只對(duì)形參只對(duì)形參r指定默認(rèn)值指定默認(rèn)
47、值12.5函數(shù)調(diào)用可以采用以下形式:函數(shù)調(diào)用可以采用以下形式: volume(45.6); /相當(dāng)于相當(dāng)于volume(45.6,12.5)volume(34.2,10.4) /h的值為的值為34.2,r的值為的值為10.4實(shí)參與形參的結(jié)合是從左至右順序進(jìn)行的實(shí)參與形參的結(jié)合是從左至右順序進(jìn)行的。因此指定默認(rèn)。因此指定默認(rèn)值的參數(shù)必須放在形參表列中的最右端,否則出錯(cuò)。例如:值的參數(shù)必須放在形參表列中的最右端,否則出錯(cuò)。例如:void f1(float a,int b=0,int c,char d=a); /不正確不正確, f2(3.5, 5)?void f2(float a,int c,int
48、 b=0, char d=a); /正確正確如果調(diào)用上面的如果調(diào)用上面的f2函數(shù),可以采取下面的形式:函數(shù),可以采取下面的形式: f2(3.5, 5, 3, x) /形參的值全部從實(shí)參得到形參的值全部從實(shí)參得到f2(3.5, 5, 3) /最后一個(gè)形參的值取默認(rèn)值最后一個(gè)形參的值取默認(rèn)值af2(3.5, 5) /最后兩個(gè)形參的值取默認(rèn)值,最后兩個(gè)形參的值取默認(rèn)值,b=0,d=a可以看到,在調(diào)用有默認(rèn)參數(shù)的函數(shù)時(shí),實(shí)參的個(gè)可以看到,在調(diào)用有默認(rèn)參數(shù)的函數(shù)時(shí),實(shí)參的個(gè)數(shù)可以與形參的個(gè)數(shù)不同,實(shí)參未給定的,從形參數(shù)可以與形參的個(gè)數(shù)不同,實(shí)參未給定的,從形參的默認(rèn)值得到值。利用這一特性,可以使函數(shù)的使
49、的默認(rèn)值得到值。利用這一特性,可以使函數(shù)的使用更加靈活。例如例用更加靈活。例如例4.7求求2個(gè)數(shù)或個(gè)數(shù)或3個(gè)數(shù)中的最大個(gè)數(shù)中的最大數(shù)。也可以不用重載函數(shù),而改用帶有默認(rèn)參數(shù)的數(shù)。也可以不用重載函數(shù),而改用帶有默認(rèn)參數(shù)的函數(shù)。函數(shù)。例例4.8 求求2個(gè)或個(gè)或3個(gè)個(gè)正正整數(shù)中的最大數(shù),用帶有默認(rèn)整數(shù)中的最大數(shù),用帶有默認(rèn)參數(shù)的函數(shù)實(shí)現(xiàn)。參數(shù)的函數(shù)實(shí)現(xiàn)。int main( )int max(int a, int b, int c=0); /函數(shù)聲明函數(shù)聲明,形參形參c有默認(rèn)值有默認(rèn)值int a,b,c; cinabc; coutmax(a,b,c)=max(a,b,c)endl; /輸出輸出3個(gè)數(shù)中
50、的最大者個(gè)數(shù)中的最大者 coutmax(a,b)=max(a,b)a) a=b; if(ca) a=c; return a; 運(yùn)行情況如下:運(yùn)行情況如下:14 -56 135 max(a,b,c)=135max(a,b)=14在使用帶有默認(rèn)參數(shù)的函數(shù)時(shí)有兩點(diǎn)要注意:在使用帶有默認(rèn)參數(shù)的函數(shù)時(shí)有兩點(diǎn)要注意:(1) 如果函數(shù)的定義在函數(shù)調(diào)用之前,則應(yīng)在函數(shù)如果函數(shù)的定義在函數(shù)調(diào)用之前,則應(yīng)在函數(shù)定義中給出默認(rèn)值。如果函數(shù)的定義在函數(shù)調(diào)用之定義中給出默認(rèn)值。如果函數(shù)的定義在函數(shù)調(diào)用之后,則在函數(shù)調(diào)用之前需要有函數(shù)聲明,此時(shí)必須后,則在函數(shù)調(diào)用之前需要有函數(shù)聲明,此時(shí)必須在函數(shù)聲明中給出默認(rèn)值,在函數(shù)
51、定義時(shí)可以不給在函數(shù)聲明中給出默認(rèn)值,在函數(shù)定義時(shí)可以不給出默認(rèn)值出默認(rèn)值(如例如例4.8)。(2) 一個(gè)函數(shù)不能既作為重載函數(shù),又作為有默認(rèn)一個(gè)函數(shù)不能既作為重載函數(shù),又作為有默認(rèn)參數(shù)的函數(shù)。因?yàn)楫?dāng)調(diào)用函數(shù)時(shí)如果少寫(xiě)一個(gè)參數(shù),參數(shù)的函數(shù)。因?yàn)楫?dāng)調(diào)用函數(shù)時(shí)如果少寫(xiě)一個(gè)參數(shù),系統(tǒng)無(wú)法判定是利用重載函數(shù)還是利用默認(rèn)參數(shù)的系統(tǒng)無(wú)法判定是利用重載函數(shù)還是利用默認(rèn)參數(shù)的函數(shù),出現(xiàn)二義性,系統(tǒng)無(wú)法執(zhí)行。函數(shù),出現(xiàn)二義性,系統(tǒng)無(wú)法執(zhí)行。C+不允許對(duì)函數(shù)作嵌套定義,也就是說(shuō)在一個(gè)函不允許對(duì)函數(shù)作嵌套定義,也就是說(shuō)在一個(gè)函數(shù)中不能完整地包含另一個(gè)函數(shù)。在一個(gè)程序中每數(shù)中不能完整地包含另一個(gè)函數(shù)。在一個(gè)程序中每一
52、個(gè)函數(shù)的定義都是互相平行和獨(dú)立的。一個(gè)函數(shù)的定義都是互相平行和獨(dú)立的。雖然雖然C+不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),也就是說(shuō),在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一也就是說(shuō),在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)。見(jiàn)圖個(gè)函數(shù)。見(jiàn)圖4.6。 4.9 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 圖圖4.6例例4.9 用弦截法求方程用弦截法求方程f(x)=x3-5x2+16x-80=0的根。的根。這是一個(gè)數(shù)值求解問(wèn)題,需要先分析用弦截法求根這是一個(gè)數(shù)值求解問(wèn)題,需要先分析用弦截法求根的的算法算法。根據(jù)數(shù)學(xué)知識(shí),可以列出以下的解題步驟:根據(jù)數(shù)學(xué)知識(shí),可以列出以下的解題步驟:
53、(1) 取兩個(gè)不同點(diǎn)取兩個(gè)不同點(diǎn)x1,x2,如果如果f(x1)和和f(x2)符號(hào)符號(hào)相反,則相反,則(x1,x2)區(qū)間內(nèi)必有一個(gè)根。如果區(qū)間內(nèi)必有一個(gè)根。如果f(x1)與與f(x2)同符號(hào),則應(yīng)改變同符號(hào),則應(yīng)改變x1,x2,直到直到f(x1),),f(x2)異異號(hào)為止。注意號(hào)為止。注意x1、x2的值不應(yīng)差太大的值不應(yīng)差太大,以保證以保證(x1,x2)區(qū)間內(nèi)只有一個(gè)根。區(qū)間內(nèi)只有一個(gè)根。(2) 連接連接(x1, f(x1))和和(x2, f(x2))兩點(diǎn)兩點(diǎn),此線(xiàn)此線(xiàn)(即弦即弦)交交x軸于軸于x,見(jiàn)圖見(jiàn)圖4.7。x1x1 xf(x1)f(x)f(x)=x3-5x2+16x-80=0 的根x1x
54、1 xf(x1)f(x)根x點(diǎn)坐標(biāo)可由下式求出:點(diǎn)坐標(biāo)可由下式求出:再由再由x求出求出f(x)。(3) 若若f(x)與與f(x1)同符號(hào)同符號(hào),則根必在則根必在(x, x2)區(qū)間內(nèi)區(qū)間內(nèi),此此時(shí)將時(shí)將x作為新的作為新的x1。如果如果f(x)與與f(x2)同符號(hào)同符號(hào),則表則表示根在示根在( x1,x)區(qū)間內(nèi)區(qū)間內(nèi),將將x作為新的作為新的x2。(4) 重復(fù)步驟重復(fù)步驟 (2) 和和 (3), 直到直到 f(x)為止為止, 為為一個(gè)很小的正數(shù)一個(gè)很小的正數(shù), 例如例如10-6。此時(shí)認(rèn)為。此時(shí)認(rèn)為 f(x)0,這時(shí)這時(shí)的的x即為即為f(x)=x3-5x2+16x-80=0的根的近似值的根的近似值。1
55、22121()()()()xf xxf xxf xf x這就是弦截法的算法,在程序中分別用以下幾個(gè)函這就是弦截法的算法,在程序中分別用以下幾個(gè)函數(shù)來(lái)實(shí)現(xiàn)以上有關(guān)部分功能:數(shù)來(lái)實(shí)現(xiàn)以上有關(guān)部分功能:(1) 用函數(shù)用函數(shù)f(x)代表代表x的函數(shù):的函數(shù):x3-5x2+16x-80。(2) 用函數(shù)用函數(shù)xpoint (x1,x2)來(lái)求來(lái)求(x1,f(x1)和和(x2,f(x2)的連的連線(xiàn)與線(xiàn)與x軸的交點(diǎn)軸的交點(diǎn)x的坐標(biāo)。的坐標(biāo)。(3) 用函數(shù)用函數(shù)root(x1,x2)來(lái)求來(lái)求(x1,x2)區(qū)間的那個(gè)實(shí)根。區(qū)間的那個(gè)實(shí)根。顯然顯然,執(zhí)行執(zhí)行root函數(shù)的過(guò)程中要用到函數(shù)的過(guò)程中要用到xpoint函數(shù)
56、函數(shù),而執(zhí)而執(zhí)行行xpoint函數(shù)的過(guò)程中要用到函數(shù)的過(guò)程中要用到 f(x) 函數(shù)。函數(shù)。根據(jù)以上算法,可以編寫(xiě)出下面的程序根據(jù)以上算法,可以編寫(xiě)出下面的程序:#include #include #include using namespace std;double f(double); /函數(shù)聲明函數(shù)聲明 double xpoint(double, double); /函數(shù)聲明函數(shù)聲明double root(double, double); /函數(shù)聲明函數(shù)聲明int main( ) double x1,x2,f1,f2,x; do coutx1x2; f1=f(x1); f2=f(x2);
57、while( f1*f2 =0 ); x=root(x1,x2); coutsetiosflags(ios fixed)setprecision(7); /指定輸出指定輸出7位小數(shù)位小數(shù) coutA root of equation is x0) y1=y; x1=x; elsex2=x; while(fabs(y)=0.00001); return x; x1x1 xf(x1)f(x)y1=yroot(double x1, double x2)的執(zhí)行過(guò)程運(yùn)行情況如下:運(yùn)行情況如下:input x1,x2:2.5 6.7 A root of equation is 5.0000000對(duì)程序的說(shuō)
58、明:對(duì)程序的說(shuō)明:(1) 在定義函數(shù)時(shí),函數(shù)名為在定義函數(shù)時(shí),函數(shù)名為f,xpoint和和root的的3個(gè)個(gè)函數(shù)是互相獨(dú)立的,并不互相從屬。這函數(shù)是互相獨(dú)立的,并不互相從屬。這3個(gè)函數(shù)均個(gè)函數(shù)均定為雙精度型。定為雙精度型。(2) 3個(gè)函數(shù)的定義均出現(xiàn)在個(gè)函數(shù)的定義均出現(xiàn)在main函數(shù)之后,因此在函數(shù)之后,因此在main函數(shù)的前面對(duì)這函數(shù)的前面對(duì)這3個(gè)函數(shù)作聲明。個(gè)函數(shù)作聲明。(3) 程序從程序從main函數(shù)開(kāi)始執(zhí)行。函數(shù)的嵌套調(diào)用見(jiàn)函數(shù)開(kāi)始執(zhí)行。函數(shù)的嵌套調(diào)用見(jiàn)圖圖4.8。圖圖4.8(4) 在在root函數(shù)中要用到求絕對(duì)值的函數(shù)函數(shù)中要用到求絕對(duì)值的函數(shù)fabs,它是它是對(duì)雙精度數(shù)求絕對(duì)值的系
59、統(tǒng)函數(shù)。它屬于數(shù)學(xué)函數(shù)對(duì)雙精度數(shù)求絕對(duì)值的系統(tǒng)函數(shù)。它屬于數(shù)學(xué)函數(shù)庫(kù),故在文件開(kāi)頭用庫(kù),故在文件開(kāi)頭用#include 把有關(guān)的頭把有關(guān)的頭文件包含進(jìn)來(lái)。文件包含進(jìn)來(lái)。 在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱(chēng)為函數(shù)的該函數(shù)本身,稱(chēng)為函數(shù)的遞歸遞歸(recursive)調(diào)用調(diào)用。例。例如:如:int f(int x)int y,z;z=f(y); /在調(diào)用函數(shù)在調(diào)用函數(shù)f的過(guò)程中,又要調(diào)用的過(guò)程中,又要調(diào)用f函數(shù)函數(shù)return (2*); 以上是直接調(diào)用本函數(shù),見(jiàn)圖以上是直接調(diào)用本函數(shù),見(jiàn)圖4.9。4.10 函數(shù)的遞歸調(diào)用函數(shù)的遞
60、歸調(diào)用 圖圖4.9 圖圖4.10圖圖4.10表示的是間接調(diào)用本函數(shù)。表示的是間接調(diào)用本函數(shù)。這兩種遞歸調(diào)用都是無(wú)終止的自身調(diào)用。程序中不這兩種遞歸調(diào)用都是無(wú)終止的自身調(diào)用。程序中不應(yīng)出現(xiàn)這種無(wú)終止的遞歸調(diào)用,遞歸調(diào)用應(yīng)是有限應(yīng)出現(xiàn)這種無(wú)終止的遞歸調(diào)用,遞歸調(diào)用應(yīng)是有限次數(shù)的、能終止的,這可以用次數(shù)的、能終止的,這可以用if語(yǔ)句來(lái)控制,只有語(yǔ)句來(lái)控制,只有在某一條件成立時(shí)才繼續(xù)執(zhí)行遞歸調(diào)用,否則就不在某一條件成立時(shí)才繼續(xù)執(zhí)行遞歸調(diào)用,否則就不再繼續(xù)。再繼續(xù)。包含遞歸調(diào)用的函數(shù)稱(chēng)為遞歸函數(shù)。包含遞歸調(diào)用的函數(shù)稱(chēng)為遞歸函數(shù)。void funcA(int,int);void funcB(int);vo
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融科技行業(yè)工作經(jīng)歷證明書(shū)(7篇)
- 綜合出生日期與工作情況證明(6篇)
- 一次難忘的事件讓我學(xué)會(huì)了成長(zhǎng):話(huà)題作文9篇范文
- 電影制作與發(fā)行聯(lián)合投資合作協(xié)議
- 遺體防腐考試試題及答案
- 六一公司團(tuán)建活動(dòng)方案
- 醫(yī)學(xué)生考試試題及答案
- 六一慶典互動(dòng)活動(dòng)方案
- 六一活動(dòng)包粽子活動(dòng)方案
- 六一活動(dòng)尋寶活動(dòng)方案
- 黨課課件含講稿:《關(guān)于加強(qiáng)黨的作風(fēng)建設(shè)論述摘編》輔導(dǎo)報(bào)告
- GB/T 19023-2025質(zhì)量管理體系成文信息指南
- 2025年北京西城區(qū)九年級(jí)中考二模英語(yǔ)試卷試題(含答案詳解)
- T/CECS 10378-2024建筑用輻射致冷涂料
- 數(shù)據(jù)驅(qū)動(dòng)的古氣候研究-洞察闡釋
- 護(hù)理糾紛處理制度
- 護(hù)理實(shí)習(xí)入科教育
- 2025年湖北省武漢市中考化學(xué)模擬練習(xí)卷(含答案)
- 《2025-0015T-FZ 智能制造 服裝定制 人體測(cè)量實(shí)施要求》知識(shí)培訓(xùn)
- 水質(zhì)污染應(yīng)急處理應(yīng)急物資預(yù)案
- 停車(chē)位管理制度細(xì)則
評(píng)論
0/150
提交評(píng)論