C++5 函數(shù)與編譯預(yù)處理_第1頁(yè)
C++5 函數(shù)與編譯預(yù)處理_第2頁(yè)
C++5 函數(shù)與編譯預(yù)處理_第3頁(yè)
C++5 函數(shù)與編譯預(yù)處理_第4頁(yè)
C++5 函數(shù)與編譯預(yù)處理_第5頁(yè)
已閱讀5頁(yè),還剩82頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論