版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++大學(xué)基礎(chǔ)教程第5章函數(shù)與編譯預(yù)處理北京科技大學(xué)15.1函數(shù)概述5.2函數(shù)定義及調(diào)用5.3
C++中的特殊函數(shù)5.4函數(shù)模板5.5局部變量和全局變量5.6變量的生存期和存儲(chǔ)類(lèi)別5.7編譯預(yù)處理(自學(xué))
第5章
函數(shù)本章將介紹關(guān)于函數(shù)的知識(shí),函數(shù)是實(shí)現(xiàn)算法的基本單位,函數(shù)的設(shè)計(jì)和使用是學(xué)習(xí)程序設(shè)計(jì)必須掌握的基本知識(shí),重點(diǎn)介紹:函數(shù)的概念、定義、原型聲明、函數(shù)的參數(shù)及函數(shù)調(diào)用函數(shù)還有一些特殊的形式,如內(nèi)聯(lián)函數(shù)、重載函數(shù)、具有默認(rèn)參數(shù)值的函數(shù)等。這些函數(shù)的特殊形式,使我們?cè)诶煤瘮?shù)實(shí)現(xiàn)算法時(shí)更方便靈活。變量的存儲(chǔ)類(lèi)型以及標(biāo)識(shí)符的作用域等概念,也是我們必須掌握的基本知識(shí)。5.1函數(shù)概述5.1.1函數(shù)簡(jiǎn)介C++程序的組成一般是將整個(gè)程序分為若干個(gè)程序模塊每個(gè)模塊用來(lái)實(shí)現(xiàn)一個(gè)特定的的功能這就是結(jié)構(gòu)化程序設(shè)計(jì)的思想!C++中模塊的實(shí)現(xiàn)函數(shù)類(lèi)函數(shù)是具有一定功能又經(jīng)常使用的相對(duì)獨(dú)立的代碼段【例】
#include<iostream>usingnamespacestd;voidprint_line(){cout<<"*********************************"<<endl;}voidprint_text(){cout<<"WelcometoChina"<<endl;}intmain(){
print_line();
print_text();
print_line(); return0;}程序的執(zhí)行總是從main函數(shù)開(kāi)始intmain函數(shù){
……
調(diào)用函數(shù)
print_line();
……}函數(shù)
print_line(){
……
}⑴一個(gè)C++源程序可以由一個(gè)或多個(gè)源程序文件組成。C++編譯系統(tǒng)在對(duì)C++源程序進(jìn)行編譯時(shí)是以文件為單位進(jìn)行的。⑵一個(gè)C++源程序文件可以由一個(gè)或多個(gè)函數(shù)組成。所有函數(shù)都是獨(dú)立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。⑶在一個(gè)C++程序中,有且僅有一個(gè)主函數(shù)main。C++序的執(zhí)行總是從main函數(shù)開(kāi)始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。說(shuō)明5.1.2函數(shù)的種類(lèi)從使用的角度看:①標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù))庫(kù)函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調(diào)用它們。附錄列出了C++的部分庫(kù)函數(shù)。②用戶(hù)自定義函數(shù)。如:例中的print_line()函數(shù)。庫(kù)函數(shù):由C++編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫(kù)中,用戶(hù)可以根據(jù)需要隨時(shí)調(diào)用常用函數(shù)如:fabs、sqrt、sin、pow、rand(常用數(shù)學(xué)函數(shù)參見(jiàn)教材附錄)函數(shù)調(diào)用形式:函數(shù)名([參數(shù)表])例如:
sqrt(x)數(shù)學(xué)函數(shù)庫(kù)中的多數(shù)函數(shù)都返回double類(lèi)型結(jié)果。使用數(shù)學(xué)庫(kù)函數(shù),需要在程序中包含math.h頭文件,這個(gè)頭文件在新的C++標(biāo)準(zhǔn)庫(kù)中稱(chēng)為cmath。函數(shù)參數(shù)可取常量、變量或表達(dá)式。例:如果c=13.0、d=3.0和f=4.0,則下列語(yǔ)句:
cout<<sqrt(c+d*f);
計(jì)算并顯示13.0+3.0*4.0=25.0的平方根,即5.0。
5.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類(lèi)型函數(shù)名(類(lèi)型名形式參數(shù)1,…
){說(shuō)明語(yǔ)句
執(zhí)行語(yǔ)句
}例如:求兩個(gè)數(shù)的最大值。
int
max(int
x,inty){intz;z=x>y?x:y;return(z);}5.2函數(shù)定義及調(diào)用程序如下:#include<iostream>usingnamespacestd;int
cube(inty);//函數(shù)原型聲明intmain(){
intx;
cin>>x;
cout<<x<<"的立方是:"<<cube(x)<<endl; return0;}/*函數(shù)定義*/
int
cube(inty)//函數(shù)定義{ returny*y*y;}例5-1編寫(xiě)一個(gè)函數(shù)cube,計(jì)算整數(shù)的立方。花括號(hào)中也可以為空,這種函數(shù)叫空函數(shù)。不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。函數(shù)名(實(shí)參表列)在C語(yǔ)言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();/*函數(shù)調(diào)用語(yǔ)句*/②if(iabs(a)>max)max=iabs(a);
/*函數(shù)調(diào)用構(gòu)成表達(dá)式*/
③m=max(c,max(a,b));/*函數(shù)調(diào)用作為函數(shù)參數(shù)*/5.2.2函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:voidswap(intx,inty){intz;z=x;x=y;y=z; ……}intmain(){inta=100,b=200;
swap(a,b); ……return0;}5.2.3函數(shù)參數(shù)傳遞與返回值1.函數(shù)的參數(shù)傳遞(1)值傳遞程序輸出結(jié)果:x=200y=100a=100b=200形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)【例】編一程序,將主函數(shù)中的兩個(gè)變量的值傳遞給swap函數(shù)中的兩個(gè)形參,交換兩個(gè)形參的值。單向值傳遞有關(guān)形參和實(shí)參的說(shuō)明:
①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。②實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值。③實(shí)參與形參類(lèi)型要一致,字符型與整型兼容。④實(shí)參與形參的個(gè)數(shù)必須相等。在函數(shù)調(diào)用時(shí),實(shí)參的值賦給與之相對(duì)應(yīng)的形參?!皢蜗蛑祩鬟f”。(2)地址傳遞地址傳遞實(shí)質(zhì)也是將實(shí)參的值賦給形參,只是這時(shí)所賦的值是一個(gè)變量或數(shù)組的地址,這是形參必須是能夠接收地址的變量,即指針變量。實(shí)參為數(shù)組名是典型的地址傳遞。若實(shí)參是數(shù)組名,由于數(shù)組名是數(shù)組的首地址,因此,與它相對(duì)應(yīng)的形參必須是數(shù)組名或指針變量。數(shù)組作函數(shù)參數(shù)包括兩種情況,一種是數(shù)組元素作函數(shù)參數(shù),由于數(shù)組元素相當(dāng)于一個(gè)變量,因此數(shù)組元素可以作函數(shù)的實(shí)參,傳遞給形參的是數(shù)組元素的值,屬于值傳遞。另一種是數(shù)組名作函數(shù)參數(shù),用數(shù)組名作函數(shù)的實(shí)參,傳遞的是數(shù)組的首地址,此時(shí)形參也應(yīng)定義為數(shù)組形式,形參數(shù)組的長(zhǎng)度可以省略?!纠?-4】用冒泡法將10個(gè)整數(shù)排序。
#include<iostream>#include<iomanip>usingnamespacestd;voidprintarr(intb[10]){
inti; for(i=0;i<10;i++)
cout<<setw(5)<<b[i];
cout<<endl;}voidsort(intb[],intn){
int
i,j,t; for(i=1;i<n;i++) for(j=0;j<n-i;j++) if(b[j]>b[j+1]) {t=b[j];b[j]=b[j+1];b[j+1]=t;}}intmain(){
inta[10]={10,21,62,96,57,81,44,31,72,35};
cout<<"排序前:"<<endl;
printarr(a); sort(a,10);
cout<<"排序后:"<<endl;
printarr(a); return0;}運(yùn)行結(jié)果:排序前:
10216296578144317235排序后:
10213135445762728196主函數(shù)調(diào)用sort函數(shù)時(shí),將實(shí)參a傳遞給形參b。假設(shè)a數(shù)組的首地址是3000,則b數(shù)組的首地址也是3000。在sort函數(shù)中對(duì)b數(shù)組中的10個(gè)數(shù)排序后,b數(shù)組中元素的值發(fā)生了變化,實(shí)際上a數(shù)組的值也隨之發(fā)生變化。2.函數(shù)的類(lèi)型和返回值(1)函數(shù)的類(lèi)型在定義一個(gè)函數(shù)時(shí)首先要定義函數(shù)的類(lèi)型,例如:int
cube(intx){…)cube函數(shù)的類(lèi)型為整型。C++語(yǔ)言中,常量、變量以及表達(dá)式有類(lèi)型,函數(shù)也有類(lèi)型,函數(shù)的類(lèi)型決定了函數(shù)返回值的類(lèi)型。若省略函數(shù)的類(lèi)型,系統(tǒng)默認(rèn)其為整型。函數(shù)的返回值是通過(guò)return語(yǔ)句帶回到主調(diào)函數(shù)的功能:終止函數(shù)的運(yùn)行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說(shuō)明:①若函數(shù)沒(méi)有返回值,return語(yǔ)句可以省略。②return語(yǔ)句中的表達(dá)式類(lèi)型一般應(yīng)和函數(shù)的類(lèi)型一致,如果不一致,系統(tǒng)自動(dòng)將表達(dá)式類(lèi)型轉(zhuǎn)換為函數(shù)類(lèi)型。(2)函數(shù)的返回值return語(yǔ)句格式:return;或return表達(dá)式
;【例5-5】計(jì)算并輸出圓的面積。#include<iostream>usingnamespacestd;s(intr){return3.14*r*r;}intmain(){
int
r,area;
cin>>r; area=s(r);
cout<<"圓的面積:"<<area<<endl; return0;}自動(dòng)轉(zhuǎn)換為int型程序運(yùn)行情況如下:3'28說(shuō)明:無(wú)返回值的函數(shù)應(yīng)將其類(lèi)型定義為void(空)類(lèi)型。5.2.4函數(shù)的嵌套調(diào)用main函數(shù){
……
調(diào)用函數(shù)A;
……}函數(shù)A{……
調(diào)用函數(shù)B;
……}函數(shù)B{
……
……
……}【例】函數(shù)的嵌套調(diào)用。intmain(){intn=3;
cout<<sub1(n)<<endl;return0;}sub1(intn){int
i,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結(jié)果:9【例5-7】編程求#include<iostream>usingnamespacestd;intfun2(intn,inti) //定義函數(shù)求各項(xiàng)的值{
intm=n; while(--i>0) m=m*n; returnm;}longfun1(intn) //定義函數(shù)求各項(xiàng)和,即表達(dá)式的值{ longsum=0;inti;
for(i=1;i<=10;++i) sum+=fun2(n,i); returnsum;}intmain(){
intn;
cout<<"輸入一個(gè)正整數(shù):"<<endl;
cin>>n;
cout<<"表達(dá)式的值是:"<<fun1(n)<<endl; return0;}運(yùn)行結(jié)果:輸入一個(gè)正整數(shù):5表達(dá)式的值是:122070305.2.5函數(shù)原型
引用函數(shù)之前,要先指定函數(shù)的接口形式函數(shù)原型函數(shù)定義函數(shù)原型聲明格式:
函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表);例:int
Max(inta,intb)函數(shù)原型
函數(shù)原型聲明使編譯器獲得關(guān)于函數(shù)名稱(chēng)、函數(shù)類(lèi)型、函數(shù)形參個(gè)數(shù)、形參類(lèi)型和形參順序的信息。函數(shù)調(diào)用時(shí),編譯器根據(jù)函數(shù)原型聲明驗(yàn)證函數(shù)調(diào)用正確與否。
函數(shù)原型
庫(kù)函數(shù)的聲明在相應(yīng)的庫(kù)的頭文件中,使用庫(kù)函數(shù)時(shí)要包含相應(yīng)的頭文件。例:#include<cmath>
調(diào)用數(shù)學(xué)庫(kù)函數(shù):
sqrt(…)sin(…)abs(…)
……fstreamFilestreamprocessingassertC-basedlibraryforassertionprocessingiomanipFormattedinput/output(I/O)requestsctypeC-basedlibraryforcharactermanipulationsmathC-basedlibraryfortrigonometricandlogarithmicfunctions函數(shù)原型
程序中,如果調(diào)用自定義的函數(shù),且函數(shù)定義在后,調(diào)用在先,則必須在調(diào)用函數(shù)之前有函數(shù)原型聲明。voidsubfun1(…);//原型聲明main(){
┆subfun1(…);//函數(shù)調(diào)用┆}voidsubfun1(…)//函數(shù)定義{
…}
函數(shù)原型
如果是函數(shù)定義在先,調(diào)用在后,則不必進(jìn)行函數(shù)原型聲明。因?yàn)榫幾g器已經(jīng)從函數(shù)定義得到關(guān)于函數(shù)的信息。voidsubfun1(…)//函數(shù)定義{
…}intmain(){
┆subfun1(…);//函數(shù)調(diào)用┆}
函數(shù)原型
源文件中,如果在所有函數(shù)定義體之外聲明函數(shù)原型,則該函數(shù)可被位于其原型聲明之后的所有函數(shù)調(diào)用。voidsubfun1(…);//原型聲明intmain(){
┆subfun1(…);//函數(shù)調(diào)用┆}voidsubfun2(){
┆subfun1(…);//函數(shù)調(diào)用┆}voidsubfun1(…)//函數(shù)定義{
…}intmain(){voidsubfun1(…);//函數(shù)原型聲明
┆
subfun1(…);//函數(shù)調(diào)用┆}voidsubfun2(){
┆subfun1(…);//函數(shù)調(diào)用,┆}voidsubfun1(…){
…}錯(cuò)誤,編譯器不識(shí)別sunfun1標(biāo)識(shí)符。intmain(){ floatcalc(float
x,float
y,char
opr); floata,b;charopr;
cout<<"輸入四則運(yùn)算表達(dá)式:";
cin>>a>>opr>>b;
if(opr=='+'||opr=='-'||opr=='*'||opr=='/')
cout<<setw(5)<<setprecision(4)<<a<<opr <<setw(5)<<setprecision(4)<<b<<"=" <<setw(5)<<setprecision(4)對(duì)被調(diào)函數(shù)的聲明【例5-8】計(jì)算并輸出兩個(gè)數(shù)的和、差、積、商。<<calc(a,b,opr)<<endl; else
cout<<"非法運(yùn)算符!"<<endl; return0;}floatcalc(float
x,float
y,char
opr){
switch(opr) { case'+':return(x+y); case'-':return(x-y); case'*':return(x*y); case'/':return(x/y); }}5.3C++中的特殊函數(shù)C++中的函數(shù)相對(duì)于C語(yǔ)言中的函數(shù)有些方便的擴(kuò)展,下面介紹三種C++中的特殊函數(shù),在C語(yǔ)言中是沒(méi)有的。5.3.1重載函數(shù)
重載函數(shù)也是函數(shù)的一種特殊情況。C++允許幾個(gè)功能類(lèi)似函數(shù)同名,但這些同名函數(shù)的形式參數(shù)必須不同,稱(chēng)這些同名函數(shù)為重載函數(shù)。例:int
max(intx,inty){returnx>y?x:y;}floatmax(floatx,floaty){returnx>y?x:y;}各重載函數(shù)形式參數(shù)的不同是指參數(shù)的個(gè)數(shù)、類(lèi)型或順序彼此不同,不包括參數(shù)標(biāo)識(shí)符的不同。如:①int
max(inta,intb){returna>b?a:b;}②int
max(intx,inty){returnx>y?x:y;}③int
max(intx,inty,intz){return(x>y?x:y)>z?(x>y?x:y):z;}①②實(shí)際是一個(gè)函數(shù),如果寫(xiě)在同一個(gè)文件中,編譯時(shí)會(huì)出現(xiàn)編譯錯(cuò)誤。若①③或②③在同一個(gè)文件中可形成重載函數(shù)。編譯器將以形式參數(shù)個(gè)數(shù)的不同來(lái)認(rèn)定和區(qū)分重載函數(shù)?!纠?-9】編程求f(x,y)的值,程序在主函數(shù)中實(shí)現(xiàn)x、y值的輸入及結(jié)果的輸出,計(jì)算功能實(shí)現(xiàn)使用重載函數(shù)。#include<iostream>usingnamespacestd;floatfun(float
x,floaty);floatfun0(floatx); //重載函數(shù)floatfun0(floatx,floaty); //重載函數(shù)intmain(){ floatx,y;
cout<<"請(qǐng)按順序輸入f(x,y)中的x和y:";
cin>>x>>y;
cout<<"f("<<x<<","<<y<<")="<<fun(x,y);
cout<<endl; return0;}floatfun(floatx,floaty){
if(x<0) return0;elseif(y<0) returnfun0(x);else returnfun0(x,y);}floatfun0(floatx){
return(x*x);}floatfun0(floatx,floaty){
return(x*x+y*y);}在使用重載函數(shù)時(shí)需要注意下面三點(diǎn):(1)
編譯器不以形式參數(shù)的標(biāo)識(shí)符區(qū)分重載函數(shù)。例int
max(inta,intb);int
max(intx,inty);編譯器認(rèn)為這是同一個(gè)函數(shù)聲明兩次,編譯時(shí)出錯(cuò)。(2)
編譯器不以函數(shù)類(lèi)型區(qū)分重載函數(shù)。floatfun(int
x,inty);int
fun(int
x,inty);如果函數(shù)名和形式參數(shù)表相同,只是函數(shù)類(lèi)型不同,編譯器同樣認(rèn)為它們是同一個(gè)函數(shù)聲明兩次,編譯出錯(cuò)。(3)
不應(yīng)該將完成不同功能的函數(shù)寫(xiě)成重載函數(shù),破壞程序的可讀性。重載函數(shù)常用于實(shí)現(xiàn)功能類(lèi)似而所處理的數(shù)據(jù)類(lèi)型不同的問(wèn)題,
5.3.2內(nèi)聯(lián)函數(shù)
函數(shù)調(diào)用時(shí),系統(tǒng)首先要保存主調(diào)函數(shù)的相關(guān)信息,再將控制轉(zhuǎn)入被調(diào)函數(shù),這些操作增加了程序執(zhí)行的時(shí)間開(kāi)銷(xiāo)。C++提供的內(nèi)聯(lián)函數(shù)形式可以減少函數(shù)調(diào)用的額外開(kāi)銷(xiāo)(時(shí)間空間開(kāi)銷(xiāo)),特別是一些常用的短小的函數(shù)適合采用內(nèi)聯(lián)函數(shù)形式。內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)的定義形式:inline函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表){函數(shù)體}
【例5-10】使用內(nèi)聯(lián)函數(shù)編寫(xiě)上例5-9。#include<iostream>usingnamespacestd;inlinefloatfun0(floatx){
return(x*x);}inlinefloatfun0(floatx,floaty){
return(x*x+y*y);}floatfun(float
x,floaty){
if(x<0) return0;elseif(y<0) returnfun0(x);else returnfun0(x,y);}intmain(){ floatx,y;
cout<<"請(qǐng)按順序輸入f(x,y)中的x和y:";
cin>>x>>y;
cout<<"f("<<x<<","<<y<<")="<<fun(x,y);
cout<<endl; return0;}內(nèi)聯(lián)函數(shù)之所以能夠減少函數(shù)調(diào)用時(shí)的系統(tǒng)空間和時(shí)間開(kāi)銷(xiāo),是因?yàn)橄到y(tǒng)在編譯程序時(shí)就已經(jīng)把內(nèi)聯(lián)函數(shù)的函數(shù)體代碼插入到相應(yīng)的函數(shù)調(diào)用位置,成為主調(diào)函數(shù)內(nèi)的一段代碼,可以直接執(zhí)行,不必再轉(zhuǎn)換流程控制權(quán)。這樣的結(jié)構(gòu),自然節(jié)省了時(shí)間和空間開(kāi)銷(xiāo),但使得主調(diào)函數(shù)代碼變長(zhǎng)。一般是只把短小的函數(shù)寫(xiě)成內(nèi)聯(lián)函數(shù)。注意:(1)內(nèi)聯(lián)函數(shù)體不能包含循環(huán)語(yǔ)句、switch語(yǔ)句和異常接口聲明。(2)內(nèi)聯(lián)函數(shù)要先定義,后調(diào)用。因?yàn)榫幾g器需要用內(nèi)聯(lián)函數(shù)的函數(shù)體代碼替換對(duì)應(yīng)的函數(shù)調(diào)用。如果內(nèi)聯(lián)函數(shù)不符合要求,編譯器就將內(nèi)聯(lián)函數(shù)當(dāng)一般函數(shù)處理。5.3.3默認(rèn)參數(shù)值的函數(shù)
具有默認(rèn)參數(shù)值的函數(shù)是一種特殊的函數(shù)形式,C++允許函數(shù)的形式參數(shù)有默認(rèn)值。例如:計(jì)算圓面積的函數(shù):double
CircleArea(double
radius=1.0){
const
double
PI=3.14;
return
PI*radius*radius;}
調(diào)用具有默認(rèn)參數(shù)值的函數(shù)時(shí),如果提供實(shí)際參數(shù)值,則函數(shù)的形參值取自實(shí)際參數(shù);如果不提供實(shí)際參數(shù)值,函數(shù)的形參采用默認(rèn)參數(shù)值。例如調(diào)用CircleArea函數(shù):#include<iostream>using
namespace
std;void
main(){
cout<<CircleArea(10.0)<<endl;//提供實(shí)際參數(shù)值
cout<<CircleArea()<<endl;//不提供實(shí)際參數(shù)值}默認(rèn)參數(shù)值函數(shù)如果有多個(gè)參數(shù),而其中只有部分參數(shù)具有默認(rèn)值,則這些具有默認(rèn)值的參數(shù)值應(yīng)該位于形參表的最右端?;蛘哒f(shuō),形參表中具有默認(rèn)參數(shù)值的參數(shù)的右邊,不能出現(xiàn)沒(méi)有默認(rèn)值的參數(shù)。例如:int
CuboidVolume(intlength=1,intwidth=1,intheight=1);//正確int
CuboidVolume(intlength,intwidth=1,intheight=1);//正確int
CuboidVolume(intlength,intwidth,intheight=1);//正確
int
CuboidVolume(intlength=1,intwidth,intheight=1);//錯(cuò)誤int
CuboidVolume(intlength,intwidth=1,intheight);//錯(cuò)誤int
CuboidVolume(intlength=1,intwidth=1,intheight);//錯(cuò)誤如果默認(rèn)參數(shù)值函數(shù)是先聲明,后定義的,則在聲明函數(shù)原型時(shí)就指定默認(rèn)參數(shù)值。如果函數(shù)定義在先(無(wú)需原型聲明),則在函數(shù)定義的形參表中指定默認(rèn)值。5.4函數(shù)模板模板是C++中的通用程序模塊。在這些程序模塊中有一些數(shù)據(jù)類(lèi)型是不具體的,或者說(shuō)是抽象的。當(dāng)這些抽象的數(shù)據(jù)類(lèi)型更換為不同的具體數(shù)據(jù)類(lèi)型以后,就會(huì)產(chǎn)生一系列具體的程序模塊。這些抽象的數(shù)據(jù)類(lèi)型稱(chēng)為“參數(shù)化類(lèi)型”(parameterizedtypes)。C++中的模板包括函數(shù)模板和類(lèi)模板。函數(shù)模板會(huì)產(chǎn)生一系列參數(shù)類(lèi)型不同的函數(shù)。類(lèi)模板則會(huì)產(chǎn)生一系列不同參數(shù)的類(lèi)。函數(shù)模板實(shí)例化后產(chǎn)生的函數(shù),稱(chēng)為模板函數(shù)。類(lèi)模板實(shí)例化后產(chǎn)生的類(lèi),稱(chēng)為模板類(lèi)。本節(jié)介紹函數(shù)模板。5.4.1函數(shù)模板的定義函數(shù)模板定義的一般格式
template<typename參數(shù)化類(lèi)型名1,…,typename參數(shù)化類(lèi)型名n>函數(shù)返回類(lèi)型函數(shù)名(形式參數(shù)列表){ 函數(shù)體 }【例5-11】函數(shù)模板的定義和使用:定義和使用確定3個(gè)數(shù)據(jù)的最大值函數(shù)模板。程序如下:#include<iostream>usingnamespacestd;template<typenameT1,typenameT2,typenameT3>T1sum_value(T1x,T2y,T3z){ returnx+y+z; }intmain(){ chara='0';intb=1;doublec=3.2;
cout<<sum_value(a,b,c)<<endl;
cout<<sum_value(b,a,c)<<endl;
cout<<sum_value(c,b,a)<<endl; return0;}實(shí)例化的模板函數(shù)。相應(yīng)的模板函數(shù)的原型可以寫(xiě)為:
charsum_value(char
x,int
y,doublez);int
sum_value(char
x,int
y,doublez);doublesum_value(char
x,int
y,doublez);在這個(gè)例子中,參數(shù)化類(lèi)型名T1作為函數(shù)類(lèi)型,決定函數(shù)返回值的數(shù)據(jù)類(lèi)型,同時(shí)定義為函數(shù)第一個(gè)形參x的數(shù)據(jù)類(lèi)型,主函數(shù)中傳遞過(guò)來(lái)的第一個(gè)實(shí)參的數(shù)據(jù)類(lèi)型會(huì)作為函數(shù)的類(lèi)型,因此第一個(gè)結(jié)果是按照字符型數(shù)據(jù)輸出;第二個(gè)結(jié)果是按照整型數(shù)數(shù)據(jù)輸出;第三個(gè)結(jié)果是按照雙精度實(shí)型數(shù)據(jù)輸出。5.4.2重載函數(shù)模板函數(shù)模板不支持參數(shù)的自動(dòng)轉(zhuǎn)換。對(duì)于函數(shù)模板:template<typenameT1>T1sum_value(T1x,T1y,T1z) { returnx+y+z; }如果用以下的方式來(lái)調(diào)用:cout<<sum_value(2,3.2,21)<<endl;在編譯時(shí)會(huì)出現(xiàn)編譯錯(cuò)誤。也就是參數(shù)T1,不可以既是整型,又是實(shí)型。例如,需要為sum_value(2,3.2,21)單獨(dú)定義對(duì)應(yīng)類(lèi)形變量的比較函數(shù)如下:
int
sum_value(int
x,float
y,intz){ returnx+y+z; }這樣就形成了函數(shù)模板和非模板函數(shù)的重載。
template<typenameT1>T1sumvalue(T1x,T1y,T1z)
和
intmaxvalue(intx,floaty,intz)重載函數(shù)模板的匹配過(guò)程是按照以下的順序來(lái)進(jìn)行的:①首先尋找函數(shù)名和參數(shù)能準(zhǔn)確匹配的非模板函數(shù);②如果沒(méi)有找到,選擇參數(shù)可以匹配的函數(shù)模板;③如果還不成功,通過(guò)參數(shù)自動(dòng)轉(zhuǎn)換,選擇非模板函數(shù)。5.5局部變量和全局變量變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語(yǔ)句內(nèi)定義的變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語(yǔ)句內(nèi)。5.5.1局部作用域和局部變量【例5-12】分析下面程序的運(yùn)行結(jié)果及變量的作用域。程序如下:#include<iostream>usingnamespacestd;voidsub(int
a,intb){
intc;/*c是局部變量,在sub函數(shù)內(nèi)有效*/ a=a+1;b=b+2;c=a+b;
cout<<"sub:a="<<a<<",b="<<b<<",c="<<c<<endl;}intmain(){
inta=1,b=2,c=3; /*a、b、c是局部變量,在main函數(shù)內(nèi)有效*/
cout<<"main:a="<<a<<",b="<<b<<",c="<<c<<endl;
sub(a,b);
cout<<"main:a="<<a<<",b="<<b<<",c="<<c<<endl; { inta=2,b=2; /*a、b是局部變量,在分程序內(nèi)有效*/ c=4;
cout<<"comp:a="<<a<<",b="<<b<<",c="<<c<<endl; }
cout<<"main:a="<<a<<",b="<<b<<",c="<<c<<endl; return0;}5.5.2全局作用域和全局變量全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開(kāi)始到本源文件結(jié)束。如在其作用域內(nèi)的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內(nèi),同名全局變量暫時(shí)不起作用。【例5-13】分析下面程序的運(yùn)行結(jié)果及變量的作用域。程序如下:#include<iostream>usingnamespacestd;intmaximum;intminimum;voidfun(int
x,int
y,intz){
intt; t=x>y?x:y; maximum=t>z?t:z; t=x<y?x:y; minimum=t<z?t:z;}intmain(){
int
a,b,c;
cout<<"輸入數(shù)據(jù)a,b,c:";
cin>>a>>b>>c;
fun(a,b,c);
cout<<"maximum="<<maximum<<endl;
cout<<"minimum="<<minimum<<endl;}5.6變量的生存期和存儲(chǔ)類(lèi)別5.6.1變量的生存期變量的生存期:變量在內(nèi)存中占據(jù)存儲(chǔ)空間的時(shí)間。程序代碼區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)存儲(chǔ)分配動(dòng)態(tài)存儲(chǔ)變量靜態(tài)存儲(chǔ)變量5.6.2變量的存儲(chǔ)類(lèi)別變量的屬性數(shù)據(jù)類(lèi)型:決定為變量分配內(nèi)存單元的長(zhǎng)度,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲(chǔ)類(lèi)別:決定了變量的生存期,給它分配在哪個(gè)存儲(chǔ)區(qū)。變量定義語(yǔ)句的一般形式存儲(chǔ)類(lèi)別數(shù)據(jù)類(lèi)型變量名1,…,變量名n;auto(自動(dòng)的)register(寄存器的)static(靜態(tài)的)
extern(外部的)1.自動(dòng)變量(auto類(lèi)別)main()
{int
x,y;…}main()
{auto
int
x,y;…}自動(dòng)變量等價(jià)可省局部變量可以定義為自動(dòng)變量。⑴內(nèi)存分配調(diào)用函數(shù)或執(zhí)行分程序時(shí)在動(dòng)態(tài)存儲(chǔ)區(qū)為其分配存儲(chǔ)單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。⑵變量的初值定義變量時(shí)若沒(méi)賦初值,變量的初值不確定;如果賦初值則每次函數(shù)被調(diào)用時(shí)執(zhí)行一次賦值操作。⑶生存期在函數(shù)或分程序執(zhí)行期間。⑷作用域自動(dòng)變量所在的函數(shù)內(nèi)或分程序內(nèi)。自動(dòng)變量【例5-15】自動(dòng)變量的使用。#include<iostream>usingnamespacestd;int
f(inta){
ints=5; /*等價(jià)于:autoints=5;*/ s+=a; returns;}intmain(){
int
i,a=1; /*等價(jià)于:autoint
i,a=1;*/
for(i=0;i<3;i++) { a+=f(a);
cout<<a<<endl; } return0;}運(yùn)行結(jié)果:719432.靜態(tài)變量(static類(lèi)別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。static
int
a;main(){floatx,y;…}f(){static
int
b=1;……}全局靜態(tài)變量局部靜態(tài)變量自動(dòng)變量不能省⑴內(nèi)存分配編譯時(shí),將其分配在內(nèi)存的靜態(tài)存儲(chǔ)區(qū)中,程序運(yùn)行結(jié)束釋放該單元。⑵靜態(tài)變量的初值若定義時(shí)未賦初值,在編譯時(shí),系統(tǒng)自動(dòng)賦初值為0;若定義時(shí)賦初值,則僅在編譯時(shí)賦初值一次,程序運(yùn)行后不再給變量賦初值。⑶生存期整個(gè)程序的執(zhí)行期間。⑷作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開(kāi)始到本源文件結(jié)束。靜態(tài)變量【例5-16】靜態(tài)變量的使用。#include<
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版雙方合作保證合同(跨境貿(mào)易金融服務(wù))2篇
- 二零二五版玩具委托寄售合作合同3篇
- 二零二五年度高端個(gè)人合伙投資管理合同4篇
- 二零二五版消防設(shè)施設(shè)備報(bào)廢與回收服務(wù)合同3篇
- 2025版消防安全應(yīng)急演練組織與驗(yàn)收合同3篇
- 二零二五年度個(gè)人股份投資居間服務(wù)合同(私募基金)4篇
- 二零二五年度“通辦”離婚登記服務(wù)指南及流程優(yōu)化合同3篇
- 二零二五年度教育設(shè)備無(wú)償借款合同范本簡(jiǎn)易模板2025年3篇
- 二零二五年度行政事業(yè)單位物業(yè)設(shè)施租賃與維護(hù)合同2篇
- 2025至2030年中國(guó)摩托車(chē)制動(dòng)凸輪數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 骨科手術(shù)的術(shù)后飲食和營(yíng)養(yǎng)指導(dǎo)
- 2024年中國(guó)南方航空股份有限公司招聘筆試參考題庫(kù)含答案解析
- 六年級(jí)上冊(cè)數(shù)學(xué)應(yīng)用題100題
- 個(gè)人代賣(mài)協(xié)議
- 公安交通管理行政處罰決定書(shū)式樣
- 10.《運(yùn)動(dòng)技能學(xué)習(xí)與控制》李強(qiáng)
- 冀教版數(shù)學(xué)七年級(jí)下冊(cè)綜合訓(xùn)練100題含答案
- 1神經(jīng)外科分級(jí)護(hù)理制度
- 場(chǎng)館惡劣天氣處置應(yīng)急預(yù)案
- 斜拉橋施工技術(shù)之斜拉索圖文并茂
- GB/T 6144-1985合成切削液
評(píng)論
0/150
提交評(píng)論