2023年面向對象程序設計復習輔導三_第1頁
2023年面向對象程序設計復習輔導三_第2頁
2023年面向對象程序設計復習輔導三_第3頁
2023年面向對象程序設計復習輔導三_第4頁
2023年面向對象程序設計復習輔導三_第5頁
已閱讀5頁,還剩33頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

面向對象程序設計復習輔導(三)—函數徐孝凱一個C++語言程序由若干個程序文獻和頭文獻所組成,每個頭文獻中通常帶有用戶類型的定義、符號常量的定義、函數的聲明等內容,每個程序文獻由若干個函數定義所組成,其中必有一個并且只有一個程序文獻中包具有主函數main,稱此程序文獻為主程序文獻。函數是C++程序中的基本功能模塊和執行單元,這一章專門討論函數的定義和調用,變品的作用域和生存期等內容。一、函數的定義(一)定義格式〈類型名〉〈函數名)([<參數表>])〈函數體〉<類型名)為系統或用戶已定義的一種數據類型,它是函數執行過程中通過roturn語句規定返回的值的類型,又稱為該函數的類型。當一個函數不需要通過return語句返回一個值時,稱為無返回值函數或無類型函數,此時需要使用保存字void作為類型名。當類型名為int時,可以省略不寫,但為了清楚起見,還是寫明為好?!春瘮得凳怯脩魹楹瘮邓鸬拿?,它是一個標記符,應符合C++標記符的一般命名規則,用戶通過使用這個函數名和實參表可以調用該函數?!磪当怼酚址Q形式參數表,它包具有任意多個(含0個,即沒有)參數說明項,當多于一個時其前后兩個參數說明項之間必須用逗號分開。每個參數說明項由一種已定義的數據類型和一個變量標記符組成,該變量標記符成為該函數的形式參數,簡稱形參,形參前面給出的數據類型稱為該形參的類型。一個函數定義中的V參數表)可以被省略,表白該函數為無參函數,若<參數表〉用void取代,則也表白是無參函數,若〈參數表〉不為空,同時又不是保存字void,則稱為帶參函數。置接著向下執行。當return語句帶有表達式時,又分為兩種情況,一種是函數類型為非引用類型,則計算出return表達式的值,并把它保存起來,以便返回后訪問它參與相應的運算;另一種情況是函數的類型為引用類型,則return中的表達式必須是一個左值,并且不能是本函數中的局部變量(關于局部變量的概念留在下一節討論),執行return語句時就返回這個左值,也可以說函數的返回值是該左值的一個引用。因此,返回為引用的函數調用表達式既可作為右值乂可作為左值使用,但非引用類型的函數表達式只能作為右值使用。例如:int&fl4(inta[],intn)(。intk=0;for(inti=l;i<n;i++)。。if(a[i]>a[k])k=i;°returna[k];)該函數的功能是從一維整型數組a[n]中求出具有最大值的元素并引用返回。當調用該函數時,其函數表達式既可以作為右值,從而取出a[k]的值,乂可以作為左值,從而向a[k]賦予新值。如:#include<iostream.h>int&f14(inta口,intn)(intk=0;for(inti=l;i<n;i++)。if(a[i]>a[k])k=i;oreturna[k];ointb[8]={25,37,18,69,54,73,62,31};。cout?fl4(b,8)?endl;f14(b,5)=86;。for(inti=0;i<8;i++)cout<<b[i]?zocout<<endl;)該程序的運營結果如下,請讀者自行分析。732537188654736231通常把函數定義為引用的情況較少出現,而定義為非引用(即普通類型和指針類型)的情況則常見。(三)函數調用舉例程序1:#inc1ude<iostrearn.h>ntxkl(intn);voidmainO(cout<v”輸入i個正整數:“;intm;cin?m;3intsum=xkl(m)+xk1(2*m+l);ocout<<sum<<en(11;}intxk1(intn),for(i=l;i<=n;i++)s+=i;returns;)該程序包含一個主函數和一個xkl函數,在程序開始給出了一條xkl函數的原型語句,使得xkl函數無論在什么地方定義,在此程序文獻中的所有函數都可以合法地調用它。注意:主函數不需要使用相應的函數原型語句加以聲明,由于C++規定不允許任何函數調用它,它只由操作系統調用并返回操作系統。函數xkl的功能是求出自然數1至n之和,這個和就是s的最后值,由return語句把它返回。在主函數中一方面為m輸入一個自然數,接著用m去調用xkl函數返回1至m之間的所有自然數之和,再用2*m+l去調用xkl函數返回1至2*m+l之間的所有自然數之和,把這兩個和加起來賦給變量sum,最后輸出sum的值。假定從鍵盤上為m輸入的止整數為5,則進行xk1(m)調用時把m的值5傳送給n,接著執行函數體后返回s的值為15,進行xkl(2*m+l)調用時把2*m+l的值11傳送給n,接著執行函數體后返回s的值為66,它們的和81被作為初值賦給sum,最后輸出的sum值為81。程序2:ttinclude<iostream.h>voidxk2(int&a,intb);voidmain()(intx=12,y=18;ocout?"x=z,?x<<,"y=H?y?end1;xk2(x,y);。cout<<"x=*?x<<*1?^y=H<<y?endl;voidxk2(int&a,intb)cout?"a="?a?*Y<"b=〃VVbVVend1;a=a+b;b=a+b;cout?z,a="?a?z'??,b="?b?end1;)該程序包含一個主函數和一個xk2函數,xk2函數使用了兩個形參,一個是整型引用變量a,另一個是整型變量b。在主函數中使用xkl(x,y)調用時,將使形參a成為實參x的別名,在函數體中對a的訪問就是對主函數中x的訪問,此調用同時把y的值傳送給形參b,在函數體中對形參b的操作是與相應的實參y無關的,由于它們使用各自的存儲空間。該程序的運營結果為:x=12y=l8a=l2b=J8a=30b=48x=30y=18程序3:#inc1ude<iostream.h>voidxk3(int*a,int*b);voidxk4(int&a,int&b);voidmain()(intx=5,y=10;cout?"x="<<x?*'<<"y="VVy<Xendl;xk3(&x,&y);cout?"x="V<x?'J?"y=?y?endl;xk4(x,y);。cout?*x=*<<x<</Y<〃y="<<y<<endl;)voidxk3(int*a,int*b)(intc=*a;*a=*b;*b=c;)voidxk4(int&a,int&b)(。intc=a;a=b;b=c;}該程序中的xk3函數用于互換a和b分別指向的兩個對象的值,主函數使用xk3(&x,&y)調用時,分別把x和y的地址賦給形參a和b,所以實際互換的是主函數中x和y的值;xk4函數用于直接互換a和b的值,由于a和b都是引用參數,所以在主函數使用xk4(x,y)調用時,執行xk4函數實際互換的是相應實參變量x和y的值此程序的運營結果為:x=5y=l0x=10y=5x=5y=10上述的xk3和xk4具有完全相同的功能,但由于在xk3中使用的是指針參數,傳送給它的實參也必須是對象的地址,在函數體中訪問指針所指向的對象必須進行間接訪問運算,所以,定義和調用xk3不如定義和調用xk4直觀和簡便。程序4:#inc1ude<iostream.h>constintN=8;intxk5(inta[],intn);voidmain(){intb[N]={1,7,2,6,4,5,3,-2);3intml=xk5(b,8);。intm2=xk5(&b[2],5);。intm3=xk5(b+3,3):cout?m1<<>'<<m2V<'>?m3<<end1;}intxk5(inta[],intn)(。inti,f=l;for(i=0;i<n;i++)f*=a[i];〃或寫成f*=*a++;。returnf;)該函數包含一個主函數和一個xk5函數,xk5函數的功能是求出一維整型數組a[n]中所有元素之積并返回。在主函數中第一次調用xk5函數時,把數組b的首地址傳送給a,把數組b的長度8傳送給n,執行函數體對數組a的操作事實上就是對主函數中數組b的操作,由于它們同時指向數組b的存儲空間;第二次調用xk5函數是把數組b中b[2]元素的地址傳送給a,把整數5傳送給n,執行函數體對數組a[n]的操作事實上是對數組b中b[2]至b[6]之間元素的操作;第三次調用xk5函數是把數組b中b[3]元素的地址傳送給a,把整數3傳送給n,執行函數體對數組a[n]的操作事實上是對數組b中b[3]至b[5]之間元素的操作。該程序的運營結果為:-10080720120程序5:#inc1ude<iostream.H>char*xk6(char*sp,char*dp);voidmain()(。chara[15]="abcadecaxybcw;3charb[15];。char*cl=xk6(a,b);ocout<<c1<<Z>?a<<,><<b<<endl;char*c2=xk6(a+4,b);cout〈Vcl<V'1<<a<<**?b<<end1;)char*xk6(char*sp,char*dp)(。if(*sp=='\0'){*dp=,\O,;returndp;}°inti=0,j;for(char*p=sp;*p;p++){//掃描sp所指字符串中的每個字符位置3°for(j=0;j<i;j++)if(*p==dp[j])break;〃當*p與dp[0]至dp[i-1]之間的o//任一元素相同則比較過程結束°if(j>=i)dp[i++]=*p;//若dp數組的前i個元素均不等于*p,則把*P寫入dp[i]元素中)dp[i]=\0*;〃寫入字符串結束符returndp;}xk6函數的功能是把sp所指向的字符串,去掉反復字符后拷貝到dp所指向的字符數組中,并返|可dp指針。在主函數中第一次調用xk6函數時,分別以a和b作為實參,第二次調用時分別以a+4(艮*⑷的地址)和b作為實參。該程序運營后的輸出結果為:abcdexywabcadecaxybcwabcdexywdecaxybwabcadecaxybcwdecaxybw程序6:#include<iostream.H>int*xk7(int*&al,int*a2);int*xk7(intal,int*a2){。coutwhenenterxk7:*al,*a2=z*?*a1<<",^<<*a2<<endl;al=newint(2**al+4);oa2=newint(2**a2—1);。cout<<,,whenleavexk7:*al,*a2="V<*al<<",”<<*a2V<endl;returna2;)voidmain(){intx=10,y=25;int*xp=&x,*yp=&y;cout?wboforecallxk7:*xp,*yp="<V*xp<<”,,,<<*yp<<ondl;int*ip=xk7(xp,yp);cout<<?,aftercallxk7:*xp,*yp="<V*xpV<",”<<*ypV〈end1;cout〈V〃*ip=*<<*ip<<endl;deletexp;//xp指向的是在執行xk7函數時動態分派的對象*aldeleteip;〃ip指向的是在執行xk7函數時動態分派的對象*a2)在xk7函數的定義中,把形參al定義為整型指針的引用,把a2定義為整型指針,當在主函數中運用xk7(xp,yp)表達式調用該函數時,al就成為xp的別名,訪問a1就等于訪問主函數中的xp,而a2同yp具有各自獨立的存儲空間,a2的初值為yp的值,在xk7函數中對a2的訪問(指直接訪問)與yp無關。此程序運營結果為:boforecallxk7:*xp,*yp=10,25whenenterxk7:*al,*a2=10,25whenleavexk7:*al,*a2=24,49aftercallxk7:*xp,*yp=24,25*ip=49三、變量的作用域在一個C++程序中,對于每個變量必須遵循先定義后使用的原則。根據變量定義的位置不同將使它具有不同的作用域。一個變量離開了它的作用域,在定義時為它分派的存儲空間就被系統自動回收了,因此該變最也就不存在了。(一)作用域分類變量的作用域具有四種類別:全局作用域、文獻作用域、函數作用域和塊作用域。具有全局作用域的變量稱為全局變量,具有塊作用域的變量稱為局部變量。.全局作用域當一個變量在一個程序文獻的所有函數定義之外(并且通常在所有函數定義之前)定義時,則該變量具有全局作用域,即該變量在整個程序涉及的所有文獻中都有效,都是可見的,都是可以訪問的。當一個全局變量不是在本程序文獻中定義時,若要在本程序文獻中使用,則必須在本文獻開始進行聲明,聲明格式為:extern〈類型名〉〈變量名〉,<變量名>,...;它與變量定義語句格式類似,其區別是:不能對變量進行初始化,并且要在整個語句前加上extern保存字。當用戶定義?個全局變量時,若沒有對其初始化,則編譯時會自動把它初始化為0。.文獻作用域當一個變量定義語句出現在一個程序文獻中的所有函數定義之外,并且該語句前帶有static保存字時,則該語句定義的所有變量都具有文獻作用域,,即在整個程序文獻中有效,但在其他文獻中是無效的,不可見的。若在定義文獻作用域變量時沒有初始化,則編譯時會自動把它初始化為0。.函數作用域在每個函數中使用的語句標號具有函數作用域,即它在本函數中有效,供本函數中的gol。語句跳轉使用。由于語句標號不是變量,應當說函數作用域不屬于變量的一種作用域。4,塊作用域當一個變量是在一個函數體內定義時;則稱它具有塊作用域,其作用域范圍是從定義點開始,直到該塊結束(即所在復合語句的右花括號)為止。具有塊作用域的變量稱為局部變量,若局部變量沒有被初始化,則系統也不會對它初始化,它的初值是不擬定的。對于在函數體中使用的變量定義語句,若在其前面加上static保存字,則稱所定義的變最為靜態局部變量,若靜態局部變量沒有被初始化,則編譯時會被自動初始化為00對于非靜態局部變量,每次執行到它的定義語句時,都會為它分派相應的存儲空間,并對帶初值表達式的變量進行初始化;而對于靜態局部變量,只是在整個程序執行過程中第一次執行到它的定義語句時為其分派相應的存儲空間,并進行初始化,以后再執行到它時什么都不會做,相稱于第一次執行后就刪除了該語句?!春瘮刁w》是一條復合語句,它以左花括號開始,到右花括號結束,中間為一條或若干條C++語句。在一個函數的參數表中,每個參數可認為任一種數據類型,涉及普通類型、指針類型、數組類型、引用類型等,一個函數的返回值可以是除數組類型之外的任何類型,涉及普通類型、指針類型和引用類型等。此外,當不需要返回值時,應把函數定義為void類型。(二)定義格式舉例(1)voidfl(){...}(2)voidf2(intx)}intf3(intx,int*p){...}char*f4(chara[])(...)(5)intf5(int&x,doubled){...}int&f6(intb[10],intn)(...)voidf7(f1oatc[][N],intm,float&max)}boolf8(ElemType*&bt,E1emType&item){...}在第一條函數定義中,函數名為門,函數類型為void,參數表為空,此函數是一個無參無類型函數。若在fl后面的圓括號內寫入保存字void,也表達為無參函數。在第二條函數定義中,僅帶有一個類型為int的形參變量x,該函數沒有返回值。在第三條函數定義中,函數名為f3,函數類型為int,函數參數為x和p,其中x為int型普通參數,p為int*型指針參數。在第四條函數定義中,函數名為f4,函數類型為char*,即字符指針類型,參數表中包含一個一維字符數組參數。注意:在定義任何類型的一維數組參數時,不需要給出維的尺寸,當然給出也是允許的,但沒有任何意義。在第五條函數定義中,函數名為「5,返回類型為int,該函數帶有兩個形參,一個為整型引用變量x,另一個為雙精度變量d。在第六條函數定義中,函數名為f6,函數類型為int&,即整型引用,該函數帶有兩個形參,一個是整型數組b,另一個是整型變量n。在這里定義形參數組b所給出的維的尺任一函數定義中的每個形參也具有塊作用域,這個塊是作為函數體的復合語句,當離開函數體后它就不存在了,函數調用時為它分派的存儲空間也就被系統自動回收了,當然引用參數相應的存儲空間不會被回收。由于每個形參具有塊作用域,所以它也是局部變量。在C++程序中定義的符號常量也同變量同樣具有全局、文獻和局部這三種作用域。當符號常量定義語句出現在所有函數定義之外,并且在前面帶有extern保存字時,則所定義的常量具有全局作用域,若在前面帶有static關鍵字或什么都沒有,則所定義的常量具有文獻作用域。若符號常量定義語句出現在?個函數體內,則定義的符號常量具有局部作用域。一個C++程序中的所有函數的函數名都具有全局作用域,所以在程序中所含的任何文獻內都可以使用任一函數名構成函數調用表達式,執行相應的函數。具有同一作用域的任何標記符,不管它表達什么對象(如常量、變量、函數、類型等)都不允許重名,若重名系統就無法唯一擬定它的含義九由于每一個復合語句就是一個塊,所以在不同復合語句中定義的對象具有不同的塊作用域,也稱為具有不同的作用域,其對象名允許重名,由于系統可以區分它們。(二)程序舉例程序7:程序主文獻7.cpp#inc1ude<iostream.h>intxk8(intn);//函數xk8的原型聲明intxk9(intn);〃函數xk9的原型聲明intAA=5;//定義全局變量AAexternconstintBB=8;〃定義全局常量BBstaticintCC=12;//定義文獻域變量CCconstintl)D=23;〃定義文獻域常量D[)voidmain()intx=15;〃x的作用域為主函數體cout?"x*x="?xk8(x)?endl;cout<<*mainFi1e:AA,BB=//<<AA<<,,'<<BB?end1;cout<<"mainFi1e:CC,DD="?CC<<’,'<<DIK<end1;cout<<xk9(16)<<endl;)intxk9(intn)//n的作用域為xk9函數體{intx=10://x的作用域為xk9函數體cout?"Xk9:x="?X?end1;returnn*x;}程序次文獻7T.cpp#inc1ude<iostrearn.h>intxk8(intn);〃函數xk8的原型聲明externintAA;//全局變量AA的聲明externconstintBB;〃全局常量BB的聲明staticintCC=120;〃定義文獻域變量CCconstintDD=230;//定義文獻域常量DDintxk8(intn)//n的作用域為xk8函數體(cout??,attachFile:AA,BB="<<AA?*,*?BB?end1;cout?"attachFile:CC,DD=〃V<CC<V','<VDD<Vend1;returnn*n;此程序包含兩個程序文獻,定義有各種類型的變量和常量,其中AA為全局變量,BB為全局常量,CC為各自的文獻域變量,DD為各自的文獻域常量,主函數中的x為作用于主函數的局部變量,xk9函數中的x為作用于該函數的局部變量,xk8和xk9函數的各自參數表中的形參n是作用于各自函數的局部變量。為了在程序次文獻77.cpP中可以使用程序主文獻7.cpp中定義的全局變量AA和全局常量BB,必須在該文獻開始對他們進行聲明。當上機輸入和運營該程序時\可以先建立程序主文獻d6-7.cpp并編譯通過,再建立程序次文獻7—1.cpp并編譯通過,然后把它們連接起來生成可執行文獻7.exe。該程序的運營結果為:attachFile:AA,BB=5,8attachFi1e:CC,DD=120,230x*x=225mainFi1e:AA,BB=5,8mainFile:CC,DD=12,23xk9:x=10160請讀者結合上述程序分析結果的對的性。程序8:#inc1ude<iostream.h>constintN=10;voidmain()(inta[N]={3,8,12,20,15,6,7,24,8,19};for(inti=0;iVN/2;i++){o?intx=a[i];a[i]=a[N-i-1];a[N-i-1]=x,for(i=0;i<N;i++)cout<<a[i]?z';cout<<endl;)在這個程序中,N為文獻域常量,a和i分別為主函數體復合語句塊內的局部數組和變量,它們的作用域從定義點開始到主函數結束,x為for循環體復合語句塊內的局部變量,它的作用域從定義點開始到for循環體結束。在主函數中,一方面定義了一維整型數組a[N],接著運用for循環互換數組a中前后對稱元素的值,使得a中的每個元素值按原有位置的逆序排列,然后依次輸出a中每個元素值。該程序運營結果為:198247615201283程序9:#include<iostream.h>voidinput0;voidoutput();intsumSquare(intb[],intn);constintnn=5;〃定義文獻域常量nninta[nn];〃定義全局域數組a[nn]voidmain()(,input();。output();。cout?sumSquare(a,nn)?endl;〃使用數組a和常量nn作為實參voidinput()>cout<〈”為數組a輸入"VVnn<<”個整數:*?end1;。for(inti=0;i<nn;i++)cin?a[i];//i是本函數的局部變量)voidoutput()(cout?"輸出數組a中的"V<nnV<"個元素值:〃<<end1;for(inti=0;i<nn;i++)cout<<a[i]<<*';//i是本函數的局部變最。cout?end1;}intsumSquare(intb[],intn)〃b將指向相應的實參數組a,//形參指針b和形參n是本函數中的局部變量(//求數組a中n個元素之和的平方。ints=0,i;//s和i是本函數的局部變量。for(i=0;i<n;i++)s+=b[i];rcturns*s;)該程序包含一個主函數和三個一般函數,主函數依次調用這三個函數。Input函數從鍵盤上向數組a[nn]輸入數據,output函數依次輸出數組a[nn]中每個元素的值,sumSquarc函數求出數組b中n個元素值之和的平方。由于調用sumSquare函數是把實參數組a和常量nn分別傳送給形參數組b和形參變量n,所以在函數體中對數組b[n]的操作事實上是對實參數組a[nn]的操作。在本程序中,nn為文獻域常量,a[nn]為全局域數組,所以,它們可以使用在該程序中的任何地方,即在任何地方都是可見的。假定程序運營時從鍵盤上輸入的5個整數為:1,2,3,4,5,則得到的運營結果為:為數組a輸入5個整數:12345輸出數組a中的5個元素值:12345225程序10:#inc1udc<iostrcam.h>intx=l0;voidmain(){inty=20;cout<<〃x,y=*<<x?,,1<<y<<end1;(。intx=30;…y=y+x;cout<<,zx,y=*?x<<*,><<y<<end1;}cout?"x,y=//?x?,/?y?end1;)在函數體外定義的x為全局變量,在主函數體中定義的y為作用于整個函數體的局部變量,在主函數體中的一條復合語句中又定義了一個變量x,它的作用域只局限于該復合語句內,離開了該復合語句它就不存在了。在C++中,當一個作用域包含另一個作用域時,則在里層作用域內可以定義與外層作用域同名的對象,此時在外層定義的同名對象,在內層將被重:新定義的同名對象屏蔽掉,使之變為不可見。如在此程序主函數體中的一條復合語句內,由于重新定義了變量X,所以全局變量X在此復合語句內暫時被屏蔽掉,當離開這條復合語句后,全局變量X為有效。此程序運營結果如下:x,y=10,20x,y=30,50x,y=10,50提醒:若要在函數體內訪問與局部變量同名的全局域或文獻域變量,則只要在該變量名前加上作用域區分符(::)即可。如::x使用在上述主函數中定義有x的復合語句內時,則就表達全局變最x,若不加作用域區分符則表達在當前作用域內定義的變量x。程序11:ttinclude<iostrcam.h>intxklO(intm,intn)//求出m和n的最大公約數(intr=m%n:while(r!=0){。m=n;。n=r;r=m%n;0)。returnn;}voidmain()intm,n;。do{cout<<end1;。cout<<〃輸入兩個整數求其最大公約數(若任一數<=0則結束):“;cin>>m>>n:°if(m<=0||n<=0)break;〃輸入的任一數小于等于0則結束循環?。coutXVm<V"和VnV〈”的最大公約數為:"V<xklO(m,n)〈<endl;。}while(1);)在這個程序中,主函數和xklO函數中都定義有m和n這兩個整數變量,并且主函數調用xklO是通過值傳送進行的,所以主函數中的m和n與xk10函數中的m和分別占用各自的存儲空間,分別具有各自的作用域,一個函數中的m和n值的變化與另一個函數中的m和n無關。假定需要依次求出(75,15),(36,90),(74,25),(350,48)等四組整數的最大公約數,則程序運營結果如下:輸入兩個整數求其最大公約數(若任一數70則結束):751575和15的最大公約數為:15輸入兩個整數求其最大公約數(若任?數<=0則結束):369036和90的最大公約數為:18輸入兩個整數求其最大公約數(若任一數<=0則結束):742574和25的最大公約數為:1輸入兩個整數求其最大公約數(若任一數<=0則結束):35048350和48的最大公約數為:2輸入兩個整數求其最大公約數(若任一數<=0則結束):00程序12:#inc1ude<iostream.h>voidxk11(int&x,inty);voidmainO(aintx=12,y=25;。xk11(x,y);cout<<*main1:x,y="<<x?**<<y?endl;。xk11(y,x);,cout?"inain2:x,y=/z?x<<*J?y<<end1;。xk11(x,x+y):,coutin3:x,y=,,<<x?,'<<y<<end1;)voidxk11(int&x,inty)(ox=x+2;y=x+y;。cout<<"xkll:x,y=*<<x<<,1<<y<<endl:)在xkll函數中,說明x為引用參數,y為非引用參數,在主函數中也定義X和y變量,每次運用不同的實參調用xkll函數,并通過輸出語句顯示出x和y的值,讀者可以借此分析不同的參數傳遞方式對不同作用域內變量的影響作用。該程序運營結果為:xkll:x,y=1439mainl:x,y=l425xkll:x,y=2741main2:x,y=1427xkll:x,y=1657main3:x,y=1627程序13:#include<iostream.h>voidxk12();voidmain()(for(inti=0;i<5;i++)xk12();)voidxkl2()(inta=0;〃a若不被初始化,則初值是未知的a++;staticintb=0;//b若不被初始化,也將被自動賦初值0b++;cout?"a="?a<</,,b=z,<<b<<endl;}在該程序的xkl2函數中定義有局部變量a和靜態局部變量b,主函數5次調用這個函數,每次調用都將為a分派存儲空間并被初始化為0,但只有第一次調用才使為b分派存儲空間并初始化為0,其余4次調用都不會再建立b并初始化,將始終訪問第一次建立的b,也就是說,靜態局部變量同全局變量和文獻域變量同樣,一經建立和初始化后將在整個程序運營過程中始終存在,只有當程序運營結束時系統才收回分派給它的存儲空間。該程序的運營結果為:a=l,b=la=l,b=2a=l,b=3寸10可以被省略。在第七條函數定義中,函數名為f7,無函數類型,參數表中包含三個參數,一個為二維單精度型數組c,第二個為整型變量m,第三個為單精度引用變量max。注意:當定義一個二維數組參數時,第二維的尺寸必須給出,并且必須是一個常量表達式,第一維尺寸可給出也可不給出,其作用相同。在第八條函數定義中,函數名為f8,返【可類型為bo。1,即邏輯類型,該函數帶有兩個參數,一個為形參bt,它為ElemType的指針引用類型,另一個為形參item,它是ElemType的引用類型,其中ElemType為一種用戶定義的類型或是通過typedef語句定義的一個類型的別名。(三)有關函數定義的幾點說明.函數原型語句在一個函數定義中,函數體之前的所有部分稱為函數頭,它給出了該函數的返回類型、每個參數的順序和類型等函數原型信息,所以當沒有專門給出函數原型說明語句時,系統就從函數頭中獲取函數原型信息。一個函數必須先定義或聲明而后才干被調用,否則編譯程序無法判斷該調用的對的性。?個函數的聲明是通過使用?條函數原型語句實現的,當然使用多條相同的原型語句聲明同一個函數雖然多余但也是允許的,編譯時不會出現錯誤。在?個完整的程序中,函數的定義和函數的調用可以在同一個程序文獻中,也可以處在不同的程序文獻中,但必須保證函數原型語句與函數調用表達式出現在同一個文獻中,并且函數原型語句出現在前,函數的調用出現在后。通常把一個程序中用戶定義的所有函數的原型語句組織在一起,構成一個頭文獻,讓該程序中所含的每個程序文獻的開始(即所有函數定義之前)包含這個頭文獻(通過#inelude命令實現),這樣不管每個函數的定義在哪里出現,都可以保證函數先聲明后使用(即調用)這一原則的實現。?個函數的原型語句就是其函數頭的?個拷貝,當然要在最后加上語句接上結束符分號。函數原型語句與函數頭也有細微的差別,在函數原型語句中,其參數表中的每個參數允許a=l,b=4a=1,b=5總之,對于全局變量、文獻域變量、加入static保存字定義的局部變量、運用new運算符動態分派的對象,它們的生存期(即所占用存儲空間的連續時間)從定義點開始直到整個程序執行結束;對于在任何函數體中定義的局部變量和值參(即非引用參數),它們的生存期從定義點開始到所在的復合語句塊結束。四、遞歸函數在C++語言程序中,主函數可以調用其他任何函數,任一函數又可以調用除主函數之外的任何函數。特別地,一個函數還可以直接或間接地調用它自己,這種情況稱為直接或間接遞歸調用。直接遞歸是指在一個函數體中使用調用本函數的函數調用表達式,間接遞歸是指在一個函數中調用另一個函數,而在另一個函數中又反過來調用這個函數。這里只簡要討論一下直接遞歸調用的情況。若一個問題的求解可以化為較小問題的求解,而較小問題的求解又可化為更小問題的求解,依次類推,這種有規律地將原問題逐漸化小的過程,并且求解小問題的方法與求解大問題的方法相同,則稱為遞歸求解過程。由于在遞歸過程中,求解的問題越化越小,最后必然可.以得到一個最小問題的解,它不需要再向下遞歸求解,得到了這個最小問題的解后,再逐層向上返回,依次得到較大問題的解,最終必將得到原有問題的解。例1:運用遞歸方法求解一維數組a[n]中n個元素之和。分析?:把求解數組a中n個元素之和看作為求解數組a中n—1個元素之和,把這個和與元素a[n-1]相加就得到了原問題的解,再把求解數組a中n-1個元素之和看作為求解數組a中n-2個元素之和,把這個和與元素a[n—2]相加就得到了上一層問題的解,依次類型,直到求解數組a中1個元素之和時可直接得到a[0],從此接上逐層向下遞歸的過程,接著逐層向上返回,第一次返回可由一個元素之和得到兩個元素之和,第二次返回再由二個元素之和得到三個元素之和,依次類推,直到第n-1次返回后根據返回值(即數組a中前n-1個元素之和)加上元素的值再返【可就結束了整個遞歸求解過程。采用遞歸方法編寫的計算函數稱為遞歸函數。假定a[n]數組的元素類型為int,則求解數組a中n個元素之和的遞歸函數為:intfun1(inta[],intn){if(n<0){?cerr?"參數n值非法!endl;exit(1);}。if(n==l)returna[0];§elsereturna[n-l]+funl(a,n-1);}在這個函數中,funl(a,n-1)為一個函數遞歸調用表達式,進行遞歸調用和普通調用(即非遞歸調用)同樣,也通過參數傳遞、函數體執行和結束返回這三個環節。在這個函數中,共需要進行n-1次遞歸調用,每次都要把實參a的值賦給本次遞歸調用為形參a分派的存儲空間中,把實參n-1的值賦給本次遞歸調用為形參n分派的存儲空間中,接著執行函數體,若當前n的值等于1,則結束本次的遞歸調用,直接返回a[0]的值,并使程序執行返回到進行本次遞歸調用的return語句中,接著計算出a[nT]與返回值之和,然后又向上層的調用返回,依次類推;若當前n的值大于1,則執行else后面的return語句,接著再向下進行遞歸調用。下面是計算一維數組b[n]中n個元素之和的完整程序。#include<iostream.h>#include<stdlib.h>intfun1(inta[],intn);voidmain()intb[8]={5,16,7,9,20,13,18,6);3ints=funl(b,8);ocout?s?endl;)intfun1(inta[],intn)(if(n<0){ocerrV<"參數n值非法!"VVendl;oexit(l);}§if(n==l)returna[0];oelsereturna[n-l]+fun1(a,n-1):)主函數中運用fun1(b,8)調用遞歸函數fun1稱為第0次遞歸調用,進行本次調用時把數組b的首地址傳送給數組參數(又稱指針參數)a,把常量8傳送給形參n,以便計算出數組b中前8個元素之和。當函數funl被主函數調用的過程中,n的值將在各層遞歸調用時從8依次變化到1,if后面的return語句只在最后一次遞歸調用時被執行并返回a[0]的值,其余每次遞歸調用都執行eIse后面的return語句,依次返回前2個、3個8個元素的值。該函數的運營結果,即s的值為94。例2.運用遞歸方法求解n階乘(n!)的值。分析:設用函數f(n)表達n!,由數學知識可知,n階乘的遞歸定義為:它等于n乘以n-1的階乘,當n等于0或1時,函數值為1,用數學公式表達為:"1(n==0或1)Yf(n)='n*f(n-1)(n>l)在這里n等于0或1是遞歸終止的條件,得到的函數值為1,當n大于1時需要向下遞歸先求出f(n-l)的值后,再乘以n才可以得到f(n)的值。計算f(n)的遞歸函數為:intf(intn)if(n==0||n==l)return1;3elsereturnn*f(n-1);)假定用f(5)去調用f(n)函數,該函數返回5*f(4)的值,因返回表達式中包具有函數f(4)表達式,所以接著進行遞歸調用,返回4*f(3)的值,依次類推,當最后進行「(1)遞歸調用,返回函數值1后,結束本次遞歸調用,返回到調用函數f(1)的位置,從而計算出2*f(l)的值2,即2*f(l)=2*l=2,作為調用函數f(2)的返回值,返回到3*f⑵表達式中,計算出值6作為f(3)函數的返回值,接著返回到4*f(3)表達式中,計算出值24作為f(4)函數的返回值,再接著返回到5火f(4)表達式中,計算出f(5)的返回值120,從而結束整個調用過程,返回到調用函數f(5)的位置繼續向下執行。上述調用和返回過程可形象地用圖6—1表達。24f⑷式I八X-~[1~/I/\,、TOC\o"1-5"\h\z1~~^3*f(2)2I八IV[圖6—1運用f(5)調用f(n)遞歸函數的執行流程運用上述計算n階乘的函數,可以編寫出一個完整程序計算出組合數CJ,其中m和k均為正整數,并且m2k。由數學知識可知,組合數CJ的含義是從m個互不相同的元素中每次取出k個不同元素所有不同取法的種數。C/也可寫成C(m,k),C/的計算公式為:不二加下面給出此題的完整程序,其中m和k的值由鍵盤輸入。#inc1ude<iostream.h>intf(intn);voidmain()(intm,k;cout式”求從m個互不相同的元素中每次取出k個元素的組合數.“〈〈edl;。do{3coutV〈”輸入m和k的值:";cin>>m>>k;if(m>0&&k>0&&m>=k)break;。elsecout<V〃輸入數據不對的,重輸!“<<endl;}while(1);cout<<,,c("V<m<<','<<k<<〃)=";cout<<f1oat(f(m))/(f(k)*f(m-k))?endl;)intf(intn)(if(n==0||n==l)return1;eIscrcturnn*f(n—1);)假定規定出C(10,3)的值,則程序運營結果如下:求從m個互不相同的元素中每次取出k個元素的組合數.輸入m和k的值:103c(10,3)=120對于象上述那樣的遞歸函數都可以很方便地改寫為非遞歸函數,求n階乘的非遞歸函數如下:intf(intn){ints=l;。for(inti=l;i<=n;i++)s*=i;rcturns;)求數組a[n]中n個元素之和的非遞歸函數為:intfun1(inta[],intn)(oif(n<0){ocerr<<"參數n值非法!"<<endl;◎exit(1);}ints=0;。for(inti=0:i<n;i++)s+=a[i];returns;}遞歸求解是一種非常重要的求解問題的方法,在計算機領域有著廣泛的用途。當然為了說明問題,上面列舉的只是最簡樸的例子,它們還不如非遞歸函數來得簡樸和易讀。五、函數重載C++程序中的每個函數都是并列定義的,不允許在一個函數中定義另一個函數,即只允許函數嵌套調用,不允許嵌套定義。每個函數的函數名都是全局量,按理說不應當重名,若重名就是反復定義錯誤。但有一種情況例外,即當且僅當兩個函數的參數表不同時,允許這兩個函數重名(即具有相同的名字),進行函數調用時,系統會根據函數名和參數表唯一擬定調用哪一個函數。當兩個參數表中的任一個參數的類型相應不同,或者兩參數表中的參數個數不同(帶有缺省值的參數不算在內),則認為這兩個參數表不同。這種具有相同函數名但具有不同參數表的函數稱為重載函數,允許使用相同函數名定義多個函數的情況稱為函數重載。如:(1)voidf1(intx,charh,floatd=1){...}charfl(){...}〃與(1)參數個數不同voidfl(intx){...}〃與⑴參數個數不同voidf1(charch){...}〃與(1)參數類型和個數均不同voidfl(charch,intx)(〃與(1)參數類型不同voidf1(inta,charb,doublec){...)//與(1)參數類型不同intfl(inta,intb){...}//與(1)參數類型不同)doub1e*f1(doub1ea[],intn){...}〃與(1)參數類型不同voidfl(inta,charb){...}(10)voidfl(inta,charb,floatc){...)intf1(intx,chary){...}在這些函數中,前八個函數為重載函數,由于它們的函數名相同,并且要么它們的參數個數不同,要么它們相應參數的類型不同,要么這兩者均不同;第九個函數不是第一個函數的重載函數,由于相應的參數類型和個數均相同(不考慮帶有缺省值的參數),當在函數調用表達式中省略最后一個實參時,系統就無法唯一擬定調用哪一個函數;第10個函數也不是第一個函數的重載函數,由于相應的參數類型和個數均相同,當在函數調用表達式中不省略最后一個實參時,系統也無法唯一擬定調用哪一個函數;第11個函數也不是第一個函數的重載函數,由于它只是返回類型不同,參數表中相應的參數類型和個數均相同,返回類型不同不是判斷是否可以重載的條件。當然參數名不同更不是判斷重栽的條件。下面程序就使用了兩個重載函數,函數名為FindMax,一個函數的功能是求出一維整型數組a中n個元素的最大值,另一個函數的功能是求出二維字符數組a中保存的n個字符串的最大值,由于這兩個函數的功能相同,只是參數的類型和實現上有所不同,所以應定義為重載函數。#include<iostream.h>#include<string.h>constintM=15;intFindMax(inta[],intn);char*FindMax(chara[][M],intn);voidmain()(inta[6]={45,28,59,43,72,36};3charb[6][M]={"qiushuhua","wangchunfong",Mningchen",。*zhaoyuanlin","gu1iang","shenyafen"};。intx=FindMax(a,6);ochar*cp=FindMax(b,6);。cout<<x<<*'<<cp<Vendl;)intFindMax(inta[],intn)(ntx=a[0];for(inti=l;i<n;i++)。if(a[i]>x)x=a[i];returnx;char*FindMax(chara[][M],intn)char*x=ci[O];for(inti=l;i<n;i++)。if(strcmp(a[i],x)>0)x=a[i];?returnx;}該程序的運營結果為:72zhaoyuanlin六、函數模板對于普通函數,所使用的每個對象的類型都是擬定的,如:intmax(intx,inty)(return(x>y?x:y);}該函數中每個參數的類型和函數返回類型均為整型。該函數的功能是返回兩個整型參數x和y中的最大值。若規定兩個雙精度數中的最大值則需要定義出如下函數:doublemax(doublex,doub1ey)(。return(x>y?x:y);)它是上述函數的一個重載,當函數調用表達式中的兩個參數均為ini型時則自動調用第一個重載函數,當這兩個參數均為double型時則自動調用第二個重載函數。若可以把功能相同只是類型不同的多個重載函數用一個函數來描述,將會給程序設計帶來極大的方面。在C++中可以通過定義函數模板來實現。每個函數模板中可以定義一個或若干個類型參數,每個類型參數代表一種數據類型,該數據類型由進行函數調用時決定,函數模板中可以運用這些類型參數定義函數返回類型,參數類型和函數體中的變顯類型。函數模板的定義格式為:template<〈類型參數表>>〈返回類型〉〈函數名)(V函數形參表,){...)<類型參數表》中包含一個或多個用逗號分開的類型參數項,每一項由保存字class開始,后根一個用戶命名的標記符,此標記符為類型參數,表達一種數據類型,它可以同一般數據類型同樣使用在函數中的任何地方?!春瘮敌螀⒈?gt;必須至少給出一個參數說明,并且在〈類型參數表》中給出的每個類型參數都必須在〈函數形參表》中得到使用,即作為形參的類型使用。下面給出一些函數模板定義的例子。格式舉例1:template<classT>Tmax(Tx,Ty)(return(x>y?x:y);}此函數模板定義了T為?種類型參數,用T作為函數的返回類型以及x和y參數的類型。該函數模板的功能是返回類型為T的x和y中的最大值。模板中T的具體類型由調用它的函數表達式決定。格式舉例2:template<classA,classB>voidff(Aa,Bb){ocout<<a?>J<<b<<endl;ocout<<sizeof(a)<<z>?sizeof(b)<<endl;)此函數模板定義了A和B兩個類型參數,用A作為形參a的類型,用B作為形參b的類型。該函數模板的功能是顯示出a和b的值及相應的類型長度。同樣,A和B的具體類型只保存參數類型,而省略參數名,并且若使用參數名也允許與函數頭中相應的參數名不同。.常量形參在定義一個函數時,若只允許函數體訪問一個形參的值,不允許修改它的值,則應把該形參說明為常量,這只要在形參說明的前面加上const保存字進行修飾即可。如:voidf9(constint&x,constchar&y);voidf10(constchar*p,charkey);在函數f9的函數體中只允許使用x和y的值,不允許修改它們的值。在函數f10的函數體中只允許使用p所指向的字符對象或字符數組對象的值,不允許修改它們的值,但在函數體中既允許使用也允許修改形參key的值。3.缺省參數在一個函數定義中,可根據需要對參數表末尾的一個或連續若干個參數給出缺省值,當調用這個函數時,若實參表中沒有給出相應的實參,則形參將采用這個缺省值。如:voidfl1(intx,inty=0){...}intfl2(inta[],charop,intk=10){...}函數f】l的定義帶有兩個參數,分別為整型變量x和y,并且y帶有缺省值(),若調用該函數的表達式為fl1(a,b),將把a的值賦給x,把b的值賦給y,接著執行函數體:若調用該函數的表達式為fl1(a+b),則也是對的的調用格式,它將把a+b的值賦給x,因y沒有相應的實參,將采用缺省值0,參數傳送后接著執行函數體。函數f12的定義帶有三個參數,其中后兩個帶有缺省值,所以調用它的函數格式有三種,一種只帶一個實參,用于向形參a傳送數據,后兩個形參采用缺省值,第二種帶有兩個實參,用于分別向形參a和op傳送數據,第三個形參采用缺省值,第三種帶有三個實參,分別用于傳送給三個形參。若一個函數帶有專門的函數原型語句,則形參的缺省值只能在該函數原型語句中給出,不允許在函數頭中給出。如對于上述的「11和fl2函數,其相應的函數原型語句分別為:voidfll(intx,inty=0);intf12(inta口,charop=>,intk=10);由調用它的函數表達式決定。格式舉例3:template<c1assType>voidinverse(Typea[],intn)(Typex;inti;for(i=0;i<n/2;i++){…x=a[i];。a[i]=a[n-i-1];a[n—i—1]=x;)}該函數模板定義了Type為一種類型參數,用該類型定義形參數組a和函數體中的變量xo該模板的功能是使數組a中的n個元素的值按逆序排列。函數模板的原型語句也是由它的函數頭后加分號所組成。如上述三個函數模板的原型語句分別如下:template<c1assT>Tmax(Tx,Ty);template<classA,classB>voidff(Aa,Bb);temp1ate<classType>voidinverse(Typea[],intn);調用函數模板的表達式同調用一般函數的表達式的格式相同,由函數名和實參表所組成,如可以使用max(a,b)調用函數模板max,當a和b均為int型時,則自動為類型參數T賦予int類型,當a和b均為double型時,則自動為類型參數T賦予double類型??傊瘮的0逯械拿總€類型參數將在調用時賦予具有該類型的形參所相應的實參的類型。當運用一個函數調用表達式調用一個函數模板時,系統一方面擬定類型參數所相應的具體類型,并按該類型生成一個具體函數,然后再調用這個具有擬定類型的具體函數。由函數模板在調用時生成的具體函數,稱為模板函數,它是函數模板的?個實例。如運用max(a,b)調用函數模板max時,假定a和b均為int型實參,則由系統自動生成的模板函數為:intmax(intx,inty)。return(x>y?x:y);)若運用inverseCb,10)調用相應的函數模板,并假定實參數組b中的元素類型為doub1e,則由系統自動生成的模板函數為:voidinverse(doublea口,intn)(doub1cx;inti;for(i=0;i<n/2;i++){。x=a[i];a[i]=a[n-i-1];,a[n-i-1]=x;}}在一個程序中,當進行函數調用時若存在相應的一般函數(即非模板函數),則將優先調用這個?般函數,只有當不存在相應的?般函數時,才會由相應的函數模板生成模板函數,然后調用之。如假定在一個程序中既存在max函數模板的定義,又存在如下的一個重載函數的定義:char*max(char*x,char*y){return(strcmp(x,y)>0)?x:y;)當使用max(a,b)進行函數調用時,并假定a和b均為char*類型,則系統將優先調用非模板的max函數,而不會去調用由max函數模板生成的、類型為char*的模板函數。若沒有專門給出類型為字符指針的max函數,將調用由函數模板生成的函數,此時比較的只是兩個指針的值,而達不到比較兩個指針所指字符串的H的,這種調用將是不對的的。因此,對于函數模板中特殊類型的解決,必須再給出相應的一般函數的定義,該函數是帶有具體類型的函數模板的一個重載函數。在調用函數模板時,類型參數是根據該類型的形參所相應的實參的類型自動擬定的,但也可以由用戶在函數調用表達式中顯式給出。即在函數名和實參表之間用一對尖括號把一種或若干個用逗號分開的實際類型括起來。如函數調用max<int>(a,b)將使max函數模板生成一個類型參數T為int的模板函數,不管a和b的類型如何,都將會把它們的值轉換為整數后再傳送給相應的整型參數x和y。下面給出一個使用函數模板的程序的例子,供讀者分析。#inc1ude<iomanip.h>#inc1ude<string.h>template<c1assTT>voidswop(TT&x,TT&y);voidswop(char*x,char*y);voidmain()(,inta1=20,a2=35;odoublebl=3.25,b2=-4.86;charcl=,a',c2='b';chardl[10]=Mabcdef”,d2[10]="ghijk";cout.setf(ios::left);〃使輸出的數據在顯示區域內靠左顯示cout〈V”數據互換前:endl;couta1="VVsetw(10)?a1<<^a2="<<setw(10)?a2<<endl;cout?"bl="?setw(l0)?bl?"b2="<<setw(10)?b2?end1;cout?,,c1="<<setw(10)<<cl<<,zc2="<<set\v(10)<<c2<<endl;coutV<"d1=*<<setw(10)<<dlV<"d2="<<setw(10)<<d2<<endl;endl;endl;endl;endl;endl;endl;<endl;swop(a1,a2);swop(b1,b2);endl;<endl;swop(a1,a2);swop(b1,b2);swop(c1,c2);swop(d1,d2);cout?end1<<”數據互換后:*?endl;couta1="<Vsetw(10)<<al<<"a2=°<<setw(10)<<a2<<cout<</zbl=/,?sctw(10)?b1<<,,b2=,/?setw(10)<<b2?end1;cout?*c1=*?setw(l0)?c1?"c2=,,?setw(10)?c2式endl;cout<<"dl="<<setw(10)?dl<<"d2=*?setw(10)<<d2<template<classTT>voidswop(TT&x,TT&y)(TTw=x;x=y;y=\v;)voidswop(char*x,char*y)(intn=strlen(x);char*w=newchartn+1];strcpy(w,x);strcpy(x,y);strcpy(y,w);數據互換前:數據互換前:a1=20b1=3.25cl=ad1=abcdef數據互換后:a1=35bl=-4.86c1=bdl=ghijk該程序的運營結果為:a2=35b2=-4.86c2=bd2=ghijka2=20b2=3.25c2=ad2=abcdef注:具體內容請參考由清華大學出版社出版的、徐孝凱主編的《C++語言基礎教程》一書。函數定義應分別改寫為:voidf11(intx,inty){...)intf12(inta[],charop,intk){...}.數組參數在函數定義中的每個數組參數事實上是指向元素類型的指針參數。對于一維數組參數說明:V數據類型》V數組名,口它與下面的指針參數說明完全等價:〈數據類型〉水指針變量名)其中〈指針變顯名>就是數組參數說明中的〈數組名>。如對于f12函數定義中的數組參數說明inta口,等價于指針參數說明int*a。也就是說,數組參數說明中的數組名a是一個類型為int*的形參。注意:在變量定義語句中定義的數組,其數組名代表的是一個數組,它的值是指向第一個元素的指針常量,這與數組形參的含義有區別。對于二維數組參數說明:<數據類型><參數名>口卜第二維尺寸>]它與下面的指針參數說明完全等價:〈數據類型〉(*<參數名>)[<第二維尺寸》]如對于f7函數定義中的二維數組參數說明f1oat等價于指針參數說明float(*c)[N]o.函數類型當調用一個函數時就執行一遍循環體,對于類型為非void的函數,函數體中至少必須帶有一條return語句,并且每條return語句必須帶有一個表達式,當執行到任一條return語句時,將計算出它的表達式的值,結束整個函數的調用過程,把這個值作為所求的函數值帶回到調用位置,參與相應的運算;對于類型為void的函數,它不需要返回任何函數值,所以在函數體中既可以使用return語句,也可以不使用,對于使用的每條return語句不允許也不需要帶有表達式,當執行到任一條return語句時,或執行到函數體最后結束

位置時,將結束函數的調用過程,返回到調用位置向下繼續執行。.內聯函數當在一個函數的定義或聲明前加上關鍵字inline則就把該函數聲明為內聯函數。計算機在執行一般函數的調用時,無論該函數多么簡樸或復雜,都要通過參數傳遞、執行函數體和返回等操作。若把一個函數聲明為內聯函數后,在程序編譯階段系統就有也許把所有調用該函數的地方都直接替換為該函數的執行代碼,由此省去函數調用時的參數傳遞和返I可操作,從而加快整個程序的執行速度。通??砂岩恍┫鄬啒愕暮瘮德暶鳛閮嚷摵瘮担瑢τ谳^復雜的函數則不應聲明為內聯函數。從用戶的角度看,調用內聯函數和一般函數沒有任何區別。下面就是一個內聯函數定義的例子,它返回形參值的立方。inlineintcube(intn)(returnn*n*n;}二、函數的調用(一)調用格式調用一個已定義或聲明的函數需要給出相應的函數調用表達式,其格式為:<函數名)(口實參表〉])若調用的是一個無參函數,或所有形

溫馨提示

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

評論

0/150

提交評論