精版第四章利用函數(shù)實(shí)現(xiàn)指定功能_第1頁(yè)
精版第四章利用函數(shù)實(shí)現(xiàn)指定功能_第2頁(yè)
精版第四章利用函數(shù)實(shí)現(xiàn)指定功能_第3頁(yè)
精版第四章利用函數(shù)實(shí)現(xiàn)指定功能_第4頁(yè)
精版第四章利用函數(shù)實(shí)現(xiàn)指定功能_第5頁(yè)
已閱讀5頁(yè),還剩80頁(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ù)實(shí)現(xiàn)指定功能4.1概述函數(shù)是程序代碼的一個(gè)自包含單元,用于完成某一特定的任務(wù)。C++是由函數(shù)構(gòu)成的,函數(shù)是C++的基本模塊。在c++面向?qū)ο蟪绦蛟O(shè)計(jì)中,主函數(shù)以外的函數(shù)大多是被封裝在類(lèi)中的。主函數(shù)或其他函數(shù)可以通過(guò)類(lèi)對(duì)象調(diào)用類(lèi)中的函數(shù)?幾點(diǎn)說(shuō)明1、一個(gè)程序必須有且只有一個(gè)main()函數(shù),C++從main()函數(shù)開(kāi)始執(zhí)行。2、C++語(yǔ)言中,所有函數(shù)都是平行獨(dú)立的,無(wú)主次、相互包含之分。函數(shù)可以嵌套調(diào)用,不可嵌套定義。3、庫(kù)函數(shù)是C++編譯系統(tǒng)已預(yù)定義的函數(shù)庫(kù)函數(shù)有很多個(gè),當(dāng)用戶使用任一庫(kù)函數(shù)時(shí),在程序中必須包含相應(yīng)的頭文件。如#include<iostream>等4.2函數(shù)定義的一般形式一、無(wú)參函數(shù)主調(diào)函數(shù)并不將數(shù)據(jù)傳給被調(diào)函數(shù)。類(lèi)型說(shuō)明函數(shù)名(void){函數(shù)體}無(wú)參函數(shù)主要用于完成某一操作。參數(shù)(多個(gè))函數(shù)值(唯一)函數(shù)體不傳遞參數(shù)voidmain(void){printstar();

print_message();printstar();}voidprintstar(void){cout<<“***********\n”;}voidprint_message(void){cout<<“Howdoyoudo!\n”;}兩個(gè)被調(diào)函數(shù)主要用于完成打印操作。輸出:***********Howdoyoudo!***********二、有參函數(shù)主調(diào)函數(shù)和被調(diào)函數(shù)之間有數(shù)據(jù)傳遞。主調(diào)函數(shù)可以將參數(shù)傳遞給被調(diào)函數(shù),被調(diào)函數(shù)中的結(jié)果也可以帶回主調(diào)函數(shù)。類(lèi)型說(shuō)明函數(shù)名(形式參數(shù)列表說(shuō)明){函數(shù)體}intmax(intx,inty){intz;z=(x>y)?x:y;returnz;}voidmain(void){inta,b,c;cin>>a>>b;c=max(a,b);cout<<“Themaxis”<<c<<endl;}ab23c3xy23z34.3關(guān)于函數(shù)參數(shù)和函數(shù)的值1、形參是被調(diào)函數(shù)中的變量;實(shí)參是主調(diào)函數(shù)賦給被調(diào)函數(shù)的特定值。在調(diào)用時(shí)實(shí)參必須是一個(gè)確定的值。2、形參與實(shí)參類(lèi)型相同,一一對(duì)應(yīng)。3、形參必須要定義類(lèi)型,因?yàn)樵诙x被調(diào)函數(shù)時(shí),不知道具體要操作什么數(shù),而定義的是要操作什么類(lèi)型的數(shù)。4、實(shí)實(shí)參對(duì)對(duì)形參參變量量的傳傳遞是是“值傳遞遞”,即即單向向傳遞遞。在內(nèi)存存中實(shí)實(shí)參、、形參參分占占不同同的單單元。5、形形參只只作用用于被被調(diào)函函數(shù),,可以以在別別的函函數(shù)中中使用用相同同的變變量名名。5a8b實(shí)參xy形參58voidfun(inta,intb){a=a*10;b=b+a;cout<<a<<‘\t’’<<b<<endl;}voidmain(void){inta=2,b=3;fun(a,b);cout<<a<<‘\t’’<<b<<endl;}ab23ab2320232023236、函函數(shù)的的返回回值通通過(guò)return語(yǔ)語(yǔ)句獲獲得。。函數(shù)只只能有有唯一一的返返回值值。7、函數(shù)返返回值值的類(lèi)類(lèi)型就就是函函數(shù)的的類(lèi)型型。intmax(floata,floatb)//函數(shù)值值為整整型函數(shù)返回回值的類(lèi)類(lèi)型,也也是函數(shù)數(shù)的類(lèi)型型8、一個(gè)個(gè)函數(shù)中中可以有有一個(gè)以以上的return語(yǔ)句,執(zhí)執(zhí)行到哪哪一個(gè)return語(yǔ)句,哪哪一個(gè)語(yǔ)語(yǔ)句起作作用。intadd(inta,intb){return(a+b);}intmax(inta,intb){if(x>y)returnx;elsereturny;}若函數(shù)體體內(nèi)沒(méi)有有return語(yǔ)句,,就一直直執(zhí)行到到函數(shù)體體的末尾尾,然后后返回到到主調(diào)函函數(shù)的調(diào)調(diào)用處。。先計(jì)算,,后返回回可以有多多個(gè)return語(yǔ)句句floatmax(floatx,floaty){floatz;z=(x>y)?x:y;returnz;}voidmain(void){floata,b,c;cin>>a>>b;c=max(a+b,a*b);cout<<““Themaxis”<<c<<endl;}被調(diào)函數(shù)數(shù)先定義義定義之后后再調(diào)用用形參必須須說(shuō)明參參數(shù)類(lèi)型型實(shí)參傳遞遞的是一一個(gè)具體體的值,,不必說(shuō)說(shuō)明參數(shù)數(shù)類(lèi)型舉例函數(shù)數(shù)的調(diào)用用例4.3voidmain(void){intx=2,y=3,z=0;voidadd(int,int,int);cout<<““(1)x=“<<x<<“y=“<<y<<“z=““<<z<<endl;add(x,y,z);cout<<(“(3)x=““<<x<<““y=“<<y<<“z=“<<z<<endl;}voidadd(intx,inty,intz){z=x+y;x=x*x;y=y*y;cout<<(“(2)x=“<<x<<“y=““<<y<<““z=“<<z<<endl;}2x3y0zxyz230495(1)x=2y=3z=0(2)x=4y=9z=5(3)x=2y=3z=01、計(jì)算算100~200之間間的素?cái)?shù)數(shù),用函數(shù)prime()判斷斷一個(gè)數(shù)數(shù)是否是是素?cái)?shù),若是該該函數(shù)返返回1,,否則返返回0。。舉例voidmain(void){for(inti=100;i<=200;i++)if(prime(i)==1)cout<<i<<‘‘\t’’;}intprime(intx){ for(inti=2;i<x/2;i++)if(x%i==0)return0;return1;}2、計(jì)算算輸入兩兩個(gè)數(shù)的的最大公公約數(shù)voidmain(void){intx,y;cin>>x>>y;cout<<gys(x,y)<<endl;}intgys(inta,intb){intr;if(a<b){r=a;a=b;b=r;}while(r=a%b){a=b;b=r;}returnb;}4.4函函數(shù)的嵌嵌套調(diào)用用C++語(yǔ)語(yǔ)言中((含C語(yǔ)語(yǔ)言),,所有函數(shù)數(shù)都是平平行獨(dú)立立的,無(wú)無(wú)主次、、相互包包含之分分。函數(shù)可以以嵌套調(diào)調(diào)用,不不可嵌套套定義。。intpower(intm,intn) //m^n{ inti,product=m;for(i=1;i<n;i++)product=product*m;returnproduct;}intsum_of_power(intk,intn)//n^k的累累加和{ inti,sum=0;for(i=1;i<=n;i++)sum+=power(i,k);returnsum;}voidmain(void){ intk,m;cin>>k>>m;cout<<"f("<<k<<","<<m<<")="<<sum_of_power(k,m)<<endl; //m^k的累加加和}嵌套調(diào)用用嵌套調(diào)用用平行定義義平行定義義舉例c4-4或或教材例例題4.44.5函函數(shù)的遞遞歸調(diào)用用在調(diào)用一一個(gè)函數(shù)數(shù)的過(guò)程程中直接接或間接接地調(diào)用用函數(shù)本本身,稱(chēng)稱(chēng)為函數(shù)數(shù)的遞歸歸調(diào)用。。例4.5有5個(gè)人人坐在一一起,問(wèn)問(wèn)第5個(gè)個(gè)人多少少歲,他他說(shuō)比第第4個(gè)人人大2歲歲。問(wèn)第第4個(gè)人人多少歲歲,他說(shuō)說(shuō)比第3個(gè)人大大2歲。。問(wèn)第3個(gè)人多多少歲,,他說(shuō)比比第2個(gè)個(gè)人大2歲。問(wèn)問(wèn)第2個(gè)個(gè)人多少少歲,他他說(shuō)比第第1個(gè)人人大2歲歲。問(wèn)第第1個(gè)人人多少歲歲,他說(shuō)說(shuō)是10歲。請(qǐng)請(qǐng)問(wèn)第5個(gè)人多多大?age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(n)=10n=1age(n-1)+2n>1intage(intn){intc;c=age(n-1)+2;returnc;}voidmain(void){intage(int);cout<<age(5)<<endl;}intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}必須有遞遞歸結(jié)束束條件雖然算法法一致,,但n不同同,c不不同,在內(nèi)存中中每一層層函數(shù)變量所在的內(nèi)內(nèi)存單元元均不相相同。必須有遞遞歸終止止條件。例4.6用遞歸方方法求n!n!=1n=0,1n*(n-1)!n>1floatfac(intn){floaty;if((n==0)||(n==1)y=1;elsey=n*fac(n-1);returny;}voidmain(void){floaty;intn;cout<<““Inputn:\n””;cin>>n;cout<<n<<““!=””<<fac(n)<<endl;}fac(5)n=5y=5*fac(4)fac(4)n=4y=4*fac(3)fac(3)n=3y=3*fac(2)fac(2)n=2y=2*fac(1)fac(1)n=1y=1returnyreturnyy=2returnyy=6returnyy=24returnyy=1204.6有有關(guān)作用用域和存存儲(chǔ)類(lèi)作用域是是指程序序中所說(shuō)說(shuō)明的標(biāo)標(biāo)識(shí)符在在哪一個(gè)個(gè)區(qū)間內(nèi)內(nèi)有效,,即在哪哪一個(gè)區(qū)區(qū)間內(nèi)可可以使用用或引用用該標(biāo)識(shí)識(shí)符。在C++中,作作用域共共分為五五類(lèi):塊作用域域、文件件作用域域、函數(shù)數(shù)原型作作用域、、函數(shù)作作用域和和類(lèi)的作作用域。。一、塊作作用域我們把用用花括號(hào)號(hào)括起來(lái)來(lái)的一部部分程序序稱(chēng)為一一個(gè)塊。。在塊內(nèi)說(shuō)說(shuō)明的標(biāo)標(biāo)識(shí)符,,只能在在該塊內(nèi)內(nèi)引用floatf1(inta){intb,c;.....}floatf2(intx,inty){inti,j;.....}voidmain(void){intm,n;.....}x,y,i,j有效a,b,c有效m,n有效注意:具有塊作作用域的的標(biāo)識(shí)符符在其作作用域內(nèi)內(nèi),將屏屏蔽其作作用塊包包含本塊塊的同名名標(biāo)識(shí)符符,即變量名相相同,局局部更優(yōu)優(yōu)先。voidmain(void){inta=2,b=3,c=5;cout<<a<<‘‘\t’’<<b<<‘‘\t’’<<c<<endl;{inta,b=2;a=b+c;cout<<a<<‘\t’’<<b<<‘\t’<<c<<endl;}c=a-b;cout<<a<<‘\t’’<<b<<‘\t’<<c<<endl;}a2b3c53 5725ab27-123-1二、文件作作用域全局變量的的作用域稱(chēng)稱(chēng)為文件作作用域,即即在整個(gè)文文件中都是是可以訪問(wèn)問(wèn)的。其缺省的作作用范圍是是:從定義義全局變量量的位置開(kāi)開(kāi)始到該源源程序文件件結(jié)束。當(dāng)在塊作用用域內(nèi)的變變量與全局局變量同名名時(shí),局部變量?jī)?yōu)優(yōu)先。p,q有效intp=1,q=5;floatf1(inta){intb,c;.....}charc1,c2;main(){intm,n;.....}a,b,c有效m,n有效c1,c2有效全局變量局部變量全局變量增增加了函數(shù)數(shù)間數(shù)據(jù)聯(lián)聯(lián)系的渠道道4intmin;intmax(intx,inty){intz;min=(x<y)?x:y;z=(x>y)?x:y;returnz;}voidmain(void){inta,b,c;cin>>a>>b;c=max(a,b);cout<<“Themaxis”<<c<<endl;cout<<“Theminis”<<min<<endl;}全局變量abc414xy1min0z41函數(shù)值為4Themaxis4Theminis1min在main()和和max()中均均有效,在內(nèi)存中有有唯一的存存儲(chǔ)空間。在塊作用域域內(nèi)可通過(guò)過(guò)作用域運(yùn)運(yùn)算符“:::”來(lái)引引用與局部變量量同名的全局變量量。#include<iostream.h>inti=100;voidmain(void){inti,j=50;i=18;//訪問(wèn)局部變量i::i=::i+4;//訪問(wèn)全全部變量ij=::i+i;//訪問(wèn)全全部變量i和局部變變量jcout<<”::i=”<<::i<<’\n’;cout<<”i=”<<i<<’\n’;cout<<”j=”<<j<<’\n’;}::i=104i=18j=122三、函數(shù)原原型作用域域在函數(shù)原型型的參數(shù)表表中說(shuō)明的的標(biāo)識(shí)符所所具有的作作用域稱(chēng)為為函數(shù)原型型作用域,,它從其說(shuō)明明處開(kāi)始,,到函數(shù)原原型說(shuō)明的的結(jié)束處結(jié)結(jié)束。floattt(intx,floaty);//函數(shù)tt的原型型說(shuō)明四、存儲(chǔ)類(lèi)類(lèi)(存儲(chǔ)儲(chǔ)期)外存內(nèi)存程序程序區(qū)靜態(tài)存儲(chǔ)區(qū)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)區(qū)存放程序代代碼存放變量需要區(qū)分變變量的存儲(chǔ)儲(chǔ)類(lèi)型作用域全局變量局部變量生存期動(dòng)態(tài)存儲(chǔ)變量靜態(tài)存儲(chǔ)變量靜態(tài)存儲(chǔ)::在文件運(yùn)運(yùn)行期間有有固定的存存儲(chǔ)空間,,直到文件件運(yùn)行結(jié)束束。動(dòng)態(tài)存儲(chǔ)::在程序運(yùn)運(yùn)行期間根根據(jù)需要分分配存儲(chǔ)空空間,函數(shù)結(jié)束后后立即釋放放空間。若一個(gè)函函數(shù)在程序序中被調(diào)用用兩次,則則每次分配配的單元有有可能不同同。程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量靜態(tài)局部變變量動(dòng)態(tài)局部變變量intfun(inta){intc;staticintb=3;c=a+b++;returnc;}voidmain(void){intx=2,y;y=fun(x);cout<<y<<endl;y=fun(x+3);cout<<y<<endl;}x2ya2b3c5455a5只賦一次初初值c9599輸出:變量b是靜靜態(tài)局部變變量,在內(nèi)內(nèi)存一旦開(kāi)開(kāi)辟空間,,就不會(huì)釋釋放,空間間值一直保保留全局變量的的存儲(chǔ)方式式(externstatic))全局變量的的默認(rèn)方式,當(dāng)在一個(gè)文件中中要引用另另一個(gè)文件件中的全局局變量或在在全局變量量定義之前前要引用它時(shí),可用用extern作說(shuō)說(shuō)明,相當(dāng)于擴(kuò)大大全局變量量的作用域域。2、靜態(tài)((static)存存儲(chǔ)類(lèi)別1、extern存存儲(chǔ)類(lèi)類(lèi)別全局變量是是在函數(shù)的的外部定義義的,編譯譯時(shí)分配在靜態(tài)態(tài)存儲(chǔ)區(qū),,如果未賦賦初值,其其值為0。它僅能在本本文件中引引用,即使在其其它文件中中用extern說(shuō)說(shuō)明也不能能使用。相當(dāng)于限制制了全局變變量的作用用域范圍。程序的作用用是:給定定b的值,,輸入a和和m,求a×b和am的值。文件file1.c中的內(nèi)容容為:inta;voidmain(void){externintpower(int);intb=3,c,d,m;cin>>a>>m;c=a*b;cout<<a<<“*”<<b<<“=“<<c<<endl;d=power(m);cout<<a<<“**””<<m<<“=““<<d<<endl;}文件file2.c中的內(nèi)容容為:externinta;intpower(intn){inti,y=1;for(i=1;i<=n;i++)y*=a;returny;}外部全局變變量定義外部全局變變量說(shuō)明引用文件外外定義的全全局變量?jī)?nèi)聯(lián)函數(shù)的的作用:使用函數(shù)可可以縮短代代碼,但函數(shù)調(diào)用時(shí)時(shí),需要使用用內(nèi)存中的的棧來(lái)保留留現(xiàn)場(chǎng)、傳傳遞參數(shù)并并產(chǎn)生程序序轉(zhuǎn)移,這這樣就影響了程序序執(zhí)行速度度4.7內(nèi)內(nèi)聯(lián)函數(shù)主調(diào)函數(shù)調(diào)用處被調(diào)函數(shù)主調(diào)函數(shù)調(diào)用處被調(diào)函數(shù)將被調(diào)函數(shù)數(shù)體的代碼碼直接插到到調(diào)用處內(nèi)聯(lián)函數(shù)C++提供供一種提高高效率的方方法,即在在編譯時(shí)將將所調(diào)用函函數(shù)的代碼碼直接嵌入入到主調(diào)函函數(shù)中,而而不是將流流程轉(zhuǎn)出去去?這種嵌嵌入到主調(diào)調(diào)函數(shù)中的的函數(shù)稱(chēng)為為內(nèi)聯(lián)函數(shù)(inlinefunction),又稱(chēng)稱(chēng)內(nèi)置函數(shù)數(shù)?內(nèi)聯(lián)函數(shù)的的定義函數(shù)定義時(shí)時(shí),在函數(shù)的類(lèi)類(lèi)型前增加加修飾詞inline。inlineintmax(intx,inty){intz;z=(x>y)?x:y;returnz;}voidmain(void){inta,b,c;cin>>a>>b;c=max(a+b,a*b);cout<<“Themaxis”<<c<<endl;}max函數(shù)不復(fù)存在intmax(intx,inty){intz;z=(x>y)?x:y;returnz;}編譯時(shí):內(nèi)聯(lián)函數(shù)的的實(shí)質(zhì)是用用存儲(chǔ)空間間(使用更更多的存儲(chǔ)儲(chǔ)空間)來(lái)來(lái)?yè)Q取時(shí)間間(減少執(zhí)執(zhí)行時(shí)間))。使用內(nèi)聯(lián)函函數(shù),可以以在編譯時(shí)時(shí)直接用代代碼替換掉掉函數(shù)調(diào)用用語(yǔ)句,從從而使執(zhí)行行時(shí)不產(chǎn)生生函數(shù)調(diào)用用舉例4.7內(nèi)聯(lián)函數(shù)的的使用場(chǎng)合合代碼不多,,只有幾行行語(yǔ)句沒(méi)有復(fù)雜結(jié)結(jié)構(gòu)語(yǔ)句((switch和循循環(huán)),否否則將被當(dāng)當(dāng)作普通函函數(shù)沒(méi)有遞歸調(diào)調(diào)用說(shuō)明代碼多時(shí),,用普通函函數(shù)是以時(shí)時(shí)間換取空空間代碼少時(shí),,用內(nèi)聯(lián)函函數(shù)是以空空間換回時(shí)時(shí)間,但卻卻保留了函函數(shù)易讀、、易改的優(yōu)優(yōu)點(diǎn)1、內(nèi)聯(lián)函函數(shù)中,不不能包含復(fù)復(fù)雜的控制制語(yǔ)句,如如循環(huán)語(yǔ)句句和switch分分支語(yǔ)句,,以及復(fù)雜雜嵌套的if語(yǔ)句。。2、內(nèi)聯(lián)函函數(shù)也要定定義在前,,調(diào)用在后后。形參與與實(shí)參之間間的關(guān)系與與一般的函函數(shù)相同。。3、對(duì)于用戶戶指定的內(nèi)聯(lián)聯(lián)函數(shù),編譯譯器是否作為為內(nèi)聯(lián)函數(shù)來(lái)來(lái)處理由編譯譯器自行決定定。說(shuō)明內(nèi)聯(lián)聯(lián)函數(shù)時(shí),只只是請(qǐng)求而不不是命令編譯譯器要這樣去去做。4、一般是那那些規(guī)模較小小又被頻繁調(diào)調(diào)用的簡(jiǎn)單函函數(shù),才適合合聲明為inline函函數(shù)。使用內(nèi)聯(lián)函數(shù)數(shù)時(shí)應(yīng)注意::重載(overload):相同名字的函函數(shù)執(zhí)行兩種種以上操作,,稱(chēng)為重載如:輸出兩個(gè)個(gè)數(shù)中的大者者voidmax(int,int){……//代碼一一}voidmax(float,float){…//代碼二}voidmax(double,double){…//代碼碼三}在C中,不允允許函數(shù)名相相同,而C++中,可以以使用相同的的函數(shù)名,以以便于程序員員記憶函數(shù)名名,但執(zhí)行的的操作卻不同同例4.84.8函數(shù)數(shù)的重載所以函數(shù)的重重載是指完成不同功能能的函數(shù)可以具有相同的函函數(shù)名。C++的編譯譯器是根據(jù)函數(shù)的實(shí)參來(lái)確定應(yīng)該調(diào)調(diào)用哪一個(gè)函函數(shù)的。intfun(inta,intb){returna+b;}intfun(inta){returna*a;}voidmain(void){cout<<fun(3,5)<<endl;cout<<fun(5)<<endl;}8251、定義的重載函函數(shù)必須具有有不同的參數(shù)個(gè)個(gè)數(shù),或不同的參數(shù)類(lèi)類(lèi)型。只有這樣編編譯系統(tǒng)才有有可能根據(jù)不不同的參數(shù)去去調(diào)用不同的的重載函數(shù)。。2、僅返回值不同同時(shí),不能定定義為重載函函數(shù)。即僅函數(shù)的類(lèi)類(lèi)型不同,不不能定義為重重載函數(shù)intfun(inta,intb){returna+b;}floatfun(inta,intb){return(float)a*a;}voidmain(void){cout<<fun(3,5)<<endl;cout<<fun(3,5)<<endl;}注意doublesin(doublex1,doublex2){ returnx1*x2;}doublesin(doublex,inta){ returna+x;}voidmain(void){ doublex;cin>>x; cout<<sin(x,x)<<endl;cout<<sin(x,10)<<endl;}sin(x,x)sin(x,10)不同的參數(shù)類(lèi)類(lèi)型intadd(inta,intb,intc){ returna+b+c;}intadd(inta,intb){ returna+b;}voidmain(void){ cout<<"3+5="<<add(3,5)<<endl;cout<<"3+5+8="<<add(3,5,8)<<endl;}不同的參數(shù)個(gè)個(gè)數(shù)3、在使用重重載函數(shù)時(shí),同名函數(shù)的的功能應(yīng)當(dāng)相相同或相近,不要用同一一函數(shù)名去實(shí)實(shí)現(xiàn)完全不相相干的功能。。所謂函數(shù)模板板,實(shí)際上是是建立一個(gè)通用函數(shù),其函數(shù)類(lèi)型型和形參類(lèi)型型不具體指定定,用一個(gè)虛擬的類(lèi)類(lèi)型來(lái)代表?這個(gè)個(gè)通用函數(shù)就就稱(chēng)為函數(shù)模模板?凡是函數(shù)體相相同的函數(shù)都都可以用這個(gè)個(gè)模板來(lái)代替替,不必定義義多個(gè)函數(shù),只需在模板板中定義一次次即可?在調(diào)用函數(shù)時(shí)時(shí)系統(tǒng)會(huì)根據(jù)據(jù)實(shí)參的類(lèi)型型來(lái)取代模板板中的虛擬類(lèi)類(lèi)型,從而實(shí)實(shí)現(xiàn)了不同函函數(shù)的功能??例4.104.9函數(shù)數(shù)模板定義函數(shù)模板板的一般形式式為template<typenameT>或template<classT>template<typenameT>//模板聲明,其中T為類(lèi)型參數(shù)Tmax(Ta,Tb,Tc)//定義一個(gè)通用用函數(shù),用T作虛擬的類(lèi)型型名{if(b>a)a=b;if(c>a)a=c;returna;}類(lèi)型參數(shù)可以以不只一個(gè),可以根據(jù)需需要確定個(gè)數(shù)數(shù)?如template<classT1,typenameT2>注意:函數(shù)模板只適適用于函數(shù)的的參數(shù)個(gè)數(shù)相相同而類(lèi)型不不同,且函數(shù)數(shù)體相同的情情況,如果參參數(shù)的個(gè)數(shù)不不同,則不能能用函數(shù)模板板?具有缺省參數(shù)數(shù)值和參數(shù)個(gè)個(gè)數(shù)可變的函函數(shù)在C++中定定義函數(shù)時(shí),,如果函數(shù)反反復(fù)被調(diào)用,,而每次調(diào)用時(shí)某某一參數(shù)值都都固定,則可以給該該參數(shù)指定默默認(rèn)值。在調(diào)用函數(shù)時(shí)時(shí),若明確給給出了這種實(shí)實(shí)參的值,則則使用相應(yīng)實(shí)實(shí)參的值;若若沒(méi)有給出相相應(yīng)的實(shí)參,,則使用缺省省的值。4.10有有默認(rèn)參數(shù)的的函數(shù)intfac(intn=2){intt=1;for(inti=1;i<=n;i++)t=t*i;returnt;}voidmain(void){cout<<fac(6)<<endl;}輸出:720fac()輸出:2舉例#include"iostream"usingnamespacestd;intmain(){voidf(intx=100);//聲明時(shí)指指定默認(rèn)值f();f(200);return0;}voidf(intx)//此處不能再指定{cout<<x<<endl;}函數(shù)有聲明時(shí)時(shí),默認(rèn)參數(shù)數(shù)應(yīng)在聲明中中指定(在定定義中指定非非法或不起作作用)使用具有缺省省參數(shù)的函數(shù)數(shù)時(shí),應(yīng)注意意以下幾點(diǎn)::沒(méi)有聲明時(shí),,可以在定義義時(shí)指定默認(rèn)認(rèn)值#include"iostream"usingnamespacestd;voidf(intx=100){cout<<x<<endl;}intmain(){f();f(200);return0;}函數(shù)的參數(shù)兩兩個(gè)以上時(shí),,默認(rèn)參數(shù)值值只能從右到左指定調(diào)用函數(shù)時(shí),,指定的實(shí)參參順序是自左左到右,中間間不能有間隔隔聲明:voidf(inti,intj=2,intk=3);//正正確voidf(inti=1,intj,intk=3);//錯(cuò)誤!調(diào)用時(shí):f(6);//f(6,2,3);f(6,7);//f(6,7,3);f(6,7,8);//f(6,7,8);f(6,,8);//錯(cuò)誤調(diào)用用!intarea(intlong=4,intwidth=2){returnlong*width;}voidmain(void){inta=8,b=6;cout<<area(a,b)<<endl;cout<<area(a)<<endl;cout<<area()<<endl;}48168默認(rèn)值可以是是全局變量、、全局常量,,甚至是一個(gè)個(gè)函數(shù)。例如:inta=1;intfun(int);intg(intx;fun(a));//OK,,允許默認(rèn)值為為函數(shù)默認(rèn)值不可以以是局部變量量,因?yàn)槟J(rèn)認(rèn)參數(shù)的函數(shù)數(shù)調(diào)用是在編編譯時(shí)確定的的,而局部變變量的位置與與值在編譯時(shí)時(shí)均無(wú)法確定定。例如intmain(){inti;voidg(intx=i);//errorC2587:“i”:非法將局部變變量作為默認(rèn)認(rèn)參數(shù)return0;}高級(jí)語(yǔ)言編譯譯過(guò)程源程序(文本文件))*.CPP目標(biāo)文件(二進(jìn)制文件件)*.OBJ可執(zhí)行文件(二進(jìn)制文件件)*.EXE庫(kù)文件(各種函數(shù)))編譯連接編譯預(yù)處理C語(yǔ)言提供的的編譯預(yù)處理理的功能有以以下三種:宏定義文件包含條件編譯4.11編編譯預(yù)處理一、宏定義不帶參數(shù)的宏宏定義用一個(gè)指定的的標(biāo)識(shí)符(即即名字)來(lái)代代表一個(gè)字符符串,以后凡凡在程序中碰碰到這個(gè)標(biāo)識(shí)識(shí)符的地方都都用字符串來(lái)代替替。這個(gè)標(biāo)識(shí)符稱(chēng)稱(chēng)為宏名,編譯前的替代過(guò)程稱(chēng)稱(chēng)為“宏展開(kāi)”。#define標(biāo)標(biāo)識(shí)符字字符串#definePRICE30voidmain(void){intnum,total;/*定定義變量*/num=10;/*變量賦值值*/total=num*PRICE;cout<<"total=“<<total<<endl;}編譯前用30替代編譯程序?qū)⒑旰甓x的內(nèi)容容認(rèn)為是字符串,沒(méi)有任何實(shí)實(shí)際的物理意意義。1、宏展開(kāi)只只是一個(gè)簡(jiǎn)單單的“物理”替換,不做做語(yǔ)法檢查,不是一個(gè)語(yǔ)語(yǔ)句,其后不加分號(hào)號(hào)“;”注意:2、#define命令令出現(xiàn)在函數(shù)數(shù)的外面,其其有效范圍為為定義處至本本源文件結(jié)束束。可以用#undef命命令終止宏定定義的作用域域。#defineG9.8voidmain(void){.....}#undefGintmax(inta,intb){......}3、對(duì)程序中中用雙引號(hào)括括起來(lái)的字符符串內(nèi)容,即即使與宏名相相同,也不進(jìn)進(jìn)行置換。4、在進(jìn)行宏宏定義中,可可以用已定義義的宏名,進(jìn)進(jìn)行層層置換換。#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rvoidmain(void){cout<<“L=“<<L<<“S=”<<S<<endl;}不置換不置換層層置換層層置換帶參數(shù)的宏定定義#define宏宏名(參參數(shù)表)字字符串#defineS(a,b)a*b....floatx,y,area;cin>>x>>y;area=S(x,y);/*area=x*y;*/形式參數(shù)實(shí)際參數(shù)宏定義宏調(diào)用定義的宏實(shí)參代入后還還原#definePI3.1415926#defineS(r)PI*r*rvoidmain(void){floata,area,b;a=3.6;b=4.0;area=S(a);cout<<“r=“<<a<<““\narea=”<<area<<endl;}S(r)PI*r*rS(a)PI*a*aPI*a*a編譯前機(jī)械替替換,實(shí)參形形參一一對(duì)應(yīng)應(yīng)#definePI3.1415926#defineS(r)PI*r*rvoidmain(void){floata,area,b;a=1;b=2;area=S(a+b);cout<<“r=“<<a<<““\narea=”<<area<<endl;}S(r)PI*r*rS(a+b)PI*a+b*a+b編譯前機(jī)械替替換,實(shí)參形形參一一對(duì)應(yīng)應(yīng)宏展開(kāi)時(shí)實(shí)參參不運(yùn)算,不不作語(yǔ)法檢查查#defineS(r)PI*(r)*(r)S(a+b)PI*(a+b)*(a+b)錯(cuò)誤定義宏時(shí)在宏宏名與帶參數(shù)數(shù)的括弧間不不能有空格。。#defineS_(r)P*r*r二、文件包含含一個(gè)源文件可可以將另外一一個(gè)源文件的的全部?jī)?nèi)容包包含進(jìn)來(lái),即即將另外的文文件包含到本本文件之中。。#include““文件件名”file1.cppBA#include“file2.cpp”ABfile1.cppfile2.cpp注意:1、文件名是是C的源文件件名,是文本本文件,后綴綴名可以任選選。*.cpp*.h2、一個(gè)#include語(yǔ)句只能能指定一個(gè)被被包含文件。。3、文文件名名用雙雙引號(hào)號(hào)或尖尖括號(hào)號(hào)括起起來(lái)。。4、包含后后所有有源文文件編編譯為為一個(gè)個(gè)可執(zhí)執(zhí)行文文件。。三、條條件編編譯C語(yǔ)言言允許許有選選擇地地對(duì)程程序的的某一一部分分進(jìn)行行編譯譯。也也就是是對(duì)一一部分分源程程序指指定編編譯條條件。。源程序可以將部分源程序不轉(zhuǎn)換為機(jī)器碼條件編編譯有有以下下幾種種形式式:1、#ifdef標(biāo)識(shí)符符程序段段1#else程序段段2#endif當(dāng)標(biāo)識(shí)識(shí)符已已被定定義過(guò)過(guò)(用用#def

溫馨提示

  • 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)論