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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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變量的生存期和存儲類別5.7編譯預(yù)處理(自學(xué))

第5章

函數(shù)本章將介紹關(guān)于函數(shù)的知識,函數(shù)是實現(xiàn)算法的基本單位,函數(shù)的設(shè)計和使用是學(xué)習(xí)程序設(shè)計必須掌握的基本知識,重點介紹:函數(shù)的概念、定義、原型聲明、函數(shù)的參數(shù)及函數(shù)調(diào)用函數(shù)還有一些特殊的形式,如內(nèi)聯(lián)函數(shù)、重載函數(shù)、具有默認(rèn)參數(shù)值的函數(shù)等。這些函數(shù)的特殊形式,使我們在利用函數(shù)實現(xiàn)算法時更方便靈活。變量的存儲類型以及標(biāo)識符的作用域等概念,也是我們必須掌握的基本知識。5.1函數(shù)概述5.1.1函數(shù)簡介C++程序的組成一般是將整個程序分為若干個程序模塊每個模塊用來實現(xiàn)一個特定的的功能這就是結(jié)構(gòu)化程序設(shè)計的思想!C++中模塊的實現(xiàn)函數(shù)類函數(shù)是具有一定功能又經(jīng)常使用的相對獨立的代碼段【例】

#include<iostream>usingnamespacestd;voidprint_line(){cout<<"*********************************"<<endl;}voidprint_text(){cout<<"WelcometoChina"<<endl;}intmain(){

print_line();

print_text();

print_line(); return0;}程序的執(zhí)行總是從main函數(shù)開始intmain函數(shù){

……

調(diào)用函數(shù)

print_line();

……}函數(shù)

print_line(){

……

}⑴一個C++源程序可以由一個或多個源程序文件組成。C++編譯系統(tǒng)在對C++源程序進(jìn)行編譯時是以文件為單位進(jìn)行的。⑵一個C++源程序文件可以由一個或多個函數(shù)組成。所有函數(shù)都是獨立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。⑶在一個C++程序中,有且僅有一個主函數(shù)main。C++序的執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個程序的運行。說明5.1.2函數(shù)的種類從使用的角度看:①標(biāo)準(zhǔn)函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調(diào)用它們。附錄列出了C++的部分庫函數(shù)。②用戶自定義函數(shù)。如:例中的print_line()函數(shù)。庫函數(shù):由C++編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫中,用戶可以根據(jù)需要隨時調(diào)用常用函數(shù)如:fabs、sqrt、sin、pow、rand(常用數(shù)學(xué)函數(shù)參見教材附錄)函數(shù)調(diào)用形式:函數(shù)名([參數(shù)表])例如:

sqrt(x)數(shù)學(xué)函數(shù)庫中的多數(shù)函數(shù)都返回double類型結(jié)果。使用數(shù)學(xué)庫函數(shù),需要在程序中包含math.h頭文件,這個頭文件在新的C++標(biāo)準(zhǔn)庫中稱為cmath。函數(shù)參數(shù)可取常量、變量或表達(dá)式。例:如果c=13.0、d=3.0和f=4.0,則下列語句:

cout<<sqrt(c+d*f);

計算并顯示13.0+3.0*4.0=25.0的平方根,即5.0。

5.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類型名形式參數(shù)1,…

){說明語句

執(zhí)行語句

}例如:求兩個數(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編寫一個函數(shù)cube,計算整數(shù)的立方?;ɡㄌ栔幸部梢詾榭?,這種函數(shù)叫空函數(shù)。不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。函數(shù)名(實參表列)在C語言中,把函數(shù)調(diào)用也作為一個表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();/*函數(shù)調(diào)用語句*/②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ù)中的兩個變量的值傳遞給swap函數(shù)中的兩個形參,交換兩個形參的值。單向值傳遞有關(guān)形參和實參的說明:

①當(dāng)函數(shù)被調(diào)用時才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。②實參可以是常量、變量或表達(dá)式,但要求它們有確定的值。③實參與形參類型要一致,字符型與整型兼容。④實參與形參的個數(shù)必須相等。在函數(shù)調(diào)用時,實參的值賦給與之相對應(yīng)的形參?!皢蜗蛑祩鬟f”。(2)地址傳遞地址傳遞實質(zhì)也是將實參的值賦給形參,只是這時所賦的值是一個變量或數(shù)組的地址,這是形參必須是能夠接收地址的變量,即指針變量。實參為數(shù)組名是典型的地址傳遞。若實參是數(shù)組名,由于數(shù)組名是數(shù)組的首地址,因此,與它相對應(yīng)的形參必須是數(shù)組名或指針變量。數(shù)組作函數(shù)參數(shù)包括兩種情況,一種是數(shù)組元素作函數(shù)參數(shù),由于數(shù)組元素相當(dāng)于一個變量,因此數(shù)組元素可以作函數(shù)的實參,傳遞給形參的是數(shù)組元素的值,屬于值傳遞。另一種是數(shù)組名作函數(shù)參數(shù),用數(shù)組名作函數(shù)的實參,傳遞的是數(shù)組的首地址,此時形參也應(yīng)定義為數(shù)組形式,形參數(shù)組的長度可以省略?!纠?-4】用冒泡法將10個整數(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;}運行結(jié)果:排序前:

10216296578144317235排序后:

10213135445762728196主函數(shù)調(diào)用sort函數(shù)時,將實參a傳遞給形參b。假設(shè)a數(shù)組的首地址是3000,則b數(shù)組的首地址也是3000。在sort函數(shù)中對b數(shù)組中的10個數(shù)排序后,b數(shù)組中元素的值發(fā)生了變化,實際上a數(shù)組的值也隨之發(fā)生變化。2.函數(shù)的類型和返回值(1)函數(shù)的類型在定義一個函數(shù)時首先要定義函數(shù)的類型,例如:int

cube(intx){…)cube函數(shù)的類型為整型。C++語言中,常量、變量以及表達(dá)式有類型,函數(shù)也有類型,函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類型,系統(tǒng)默認(rèn)其為整型。函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止函數(shù)的運行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說明:①若函數(shù)沒有返回值,return語句可以省略。②return語句中的表達(dá)式類型一般應(yīng)和函數(shù)的類型一致,如果不一致,系統(tǒng)自動將表達(dá)式類型轉(zhuǎn)換為函數(shù)類型。(2)函數(shù)的返回值return語句格式:return;或return表達(dá)式

;【例5-5】計算并輸出圓的面積。#include<iostream>usingnamespacestd;s(intr){return3.14*r*r;}intmain(){

int

r,area;

cin>>r; area=s(r);

cout<<"圓的面積:"<<area<<endl; return0;}自動轉(zhuǎn)換為int型程序運行情況如下:3'28說明:無返回值的函數(shù)應(yīng)將其類型定義為void(空)類型。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ù)求各項的值{

intm=n; while(--i>0) m=m*n; returnm;}longfun1(intn) //定義函數(shù)求各項和,即表達(dá)式的值{ longsum=0;inti;

for(i=1;i<=10;++i) sum+=fun2(n,i); returnsum;}intmain(){

intn;

cout<<"輸入一個正整數(shù):"<<endl;

cin>>n;

cout<<"表達(dá)式的值是:"<<fun1(n)<<endl; return0;}運行結(jié)果:輸入一個正整數(shù):5表達(dá)式的值是:122070305.2.5函數(shù)原型

引用函數(shù)之前,要先指定函數(shù)的接口形式函數(shù)原型函數(shù)定義函數(shù)原型聲明格式:

函數(shù)類型函數(shù)名(形式參數(shù)表);例:int

Max(inta,intb)函數(shù)原型

函數(shù)原型聲明使編譯器獲得關(guān)于函數(shù)名稱、函數(shù)類型、函數(shù)形參個數(shù)、形參類型和形參順序的信息。函數(shù)調(diào)用時,編譯器根據(jù)函數(shù)原型聲明驗證函數(shù)調(diào)用正確與否。

函數(shù)原型

庫函數(shù)的聲明在相應(yīng)的庫的頭文件中,使用庫函數(shù)時要包含相應(yīng)的頭文件。例:#include<cmath>

調(diào)用數(shù)學(xué)庫函數(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ù)原型聲明。因為編譯器已經(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(…){

…}錯誤,編譯器不識別sunfun1標(biāo)識符。intmain(){ floatcalc(float

x,float

y,char

opr); floata,b;charopr;

cout<<"輸入四則運算表達(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)對被調(diào)函數(shù)的聲明【例5-8】計算并輸出兩個數(shù)的和、差、積、商。<<calc(a,b,opr)<<endl; else

cout<<"非法運算符!"<<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ù)相對于C語言中的函數(shù)有些方便的擴(kuò)展,下面介紹三種C++中的特殊函數(shù),在C語言中是沒有的。5.3.1重載函數(shù)

重載函數(shù)也是函數(shù)的一種特殊情況。C++允許幾個功能類似函數(shù)同名,但這些同名函數(shù)的形式參數(shù)必須不同,稱這些同名函數(shù)為重載函數(shù)。例:int

max(intx,inty){returnx>y?x:y;}floatmax(floatx,floaty){returnx>y?x:y;}各重載函數(shù)形式參數(shù)的不同是指參數(shù)的個數(shù)、類型或順序彼此不同,不包括參數(shù)標(biāo)識符的不同。如:①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ù),如果寫在同一個文件中,編譯時會出現(xiàn)編譯錯誤。若①③或②③在同一個文件中可形成重載函數(shù)。編譯器將以形式參數(shù)個數(shù)的不同來認(rèn)定和區(qū)分重載函數(shù)?!纠?-9】編程求f(x,y)的值,程序在主函數(shù)中實現(xiàn)x、y值的輸入及結(jié)果的輸出,計算功能實現(xiàn)使用重載函數(shù)。#include<iostream>usingnamespacestd;floatfun(float

x,floaty);floatfun0(floatx); //重載函數(shù)floatfun0(floatx,floaty); //重載函數(shù)intmain(){ floatx,y;

cout<<"請按順序輸入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ù)時需要注意下面三點:(1)

編譯器不以形式參數(shù)的標(biāo)識符區(qū)分重載函數(shù)。例int

max(inta,intb);int

max(intx,inty);編譯器認(rèn)為這是同一個函數(shù)聲明兩次,編譯時出錯。(2)

編譯器不以函數(shù)類型區(qū)分重載函數(shù)。floatfun(int

x,inty);int

fun(int

x,inty);如果函數(shù)名和形式參數(shù)表相同,只是函數(shù)類型不同,編譯器同樣認(rèn)為它們是同一個函數(shù)聲明兩次,編譯出錯。(3)

不應(yīng)該將完成不同功能的函數(shù)寫成重載函數(shù),破壞程序的可讀性。重載函數(shù)常用于實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題,

5.3.2內(nèi)聯(lián)函數(shù)

函數(shù)調(diào)用時,系統(tǒng)首先要保存主調(diào)函數(shù)的相關(guān)信息,再將控制轉(zhuǎn)入被調(diào)函數(shù),這些操作增加了程序執(zhí)行的時間開銷。C++提供的內(nèi)聯(lián)函數(shù)形式可以減少函數(shù)調(diào)用的額外開銷(時間空間開銷),特別是一些常用的短小的函數(shù)適合采用內(nèi)聯(lián)函數(shù)形式。內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)的定義形式:inline函數(shù)類型函數(shù)名(形式參數(shù)表){函數(shù)體}

【例5-10】使用內(nèi)聯(lián)函數(shù)編寫上例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<<"請按順序輸入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)用時的系統(tǒng)空間和時間開銷,是因為系統(tǒng)在編譯程序時就已經(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é)省了時間和空間開銷,但使得主調(diào)函數(shù)代碼變長。一般是只把短小的函數(shù)寫成內(nèi)聯(lián)函數(shù)。注意:(1)內(nèi)聯(lián)函數(shù)體不能包含循環(huán)語句、switch語句和異常接口聲明。(2)內(nèi)聯(lián)函數(shù)要先定義,后調(diào)用。因為編譯器需要用內(nèi)聯(lián)函數(shù)的函數(shù)體代碼替換對應(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)值。例如:計算圓面積的函數(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ù)的形參采用默認(rèn)參數(shù)值。例如調(diào)用CircleArea函數(shù):#include<iostream>using

namespace

std;void

main(){

cout<<CircleArea(10.0)<<endl;//提供實際參數(shù)值

cout<<CircleArea()<<endl;//不提供實際參數(shù)值}默認(rèn)參數(shù)值函數(shù)如果有多個參數(shù),而其中只有部分參數(shù)具有默認(rèn)值,則這些具有默認(rèn)值的參數(shù)值應(yīng)該位于形參表的最右端。或者說,形參表中具有默認(rèn)參數(shù)值的參數(shù)的右邊,不能出現(xiàn)沒有默認(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);//錯誤int

CuboidVolume(intlength,intwidth=1,intheight);//錯誤int

CuboidVolume(intlength=1,intwidth=1,intheight);//錯誤如果默認(rèn)參數(shù)值函數(shù)是先聲明,后定義的,則在聲明函數(shù)原型時就指定默認(rèn)參數(shù)值。如果函數(shù)定義在先(無需原型聲明),則在函數(shù)定義的形參表中指定默認(rèn)值。5.4函數(shù)模板模板是C++中的通用程序模塊。在這些程序模塊中有一些數(shù)據(jù)類型是不具體的,或者說是抽象的。當(dāng)這些抽象的數(shù)據(jù)類型更換為不同的具體數(shù)據(jù)類型以后,就會產(chǎn)生一系列具體的程序模塊。這些抽象的數(shù)據(jù)類型稱為“參數(shù)化類型”(parameterizedtypes)。C++中的模板包括函數(shù)模板和類模板。函數(shù)模板會產(chǎn)生一系列參數(shù)類型不同的函數(shù)。類模板則會產(chǎn)生一系列不同參數(shù)的類。函數(shù)模板實例化后產(chǎn)生的函數(shù),稱為模板函數(shù)。類模板實例化后產(chǎn)生的類,稱為模板類。本節(jié)介紹函數(shù)模板。5.4.1函數(shù)模板的定義函數(shù)模板定義的一般格式

template<typename參數(shù)化類型名1,…,typename參數(shù)化類型名n>函數(shù)返回類型函數(shù)名(形式參數(shù)列表){ 函數(shù)體 }【例5-11】函數(shù)模板的定義和使用:定義和使用確定3個數(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ù)。相應(yīng)的模板函數(shù)的原型可以寫為:

charsum_value(char

x,int

y,doublez);int

sum_value(char

x,int

y,doublez);doublesum_value(char

x,int

y,doublez);在這個例子中,參數(shù)化類型名T1作為函數(shù)類型,決定函數(shù)返回值的數(shù)據(jù)類型,同時定義為函數(shù)第一個形參x的數(shù)據(jù)類型,主函數(shù)中傳遞過來的第一個實參的數(shù)據(jù)類型會作為函數(shù)的類型,因此第一個結(jié)果是按照字符型數(shù)據(jù)輸出;第二個結(jié)果是按照整型數(shù)數(shù)據(jù)輸出;第三個結(jié)果是按照雙精度實型數(shù)據(jù)輸出。5.4.2重載函數(shù)模板函數(shù)模板不支持參數(shù)的自動轉(zhuǎn)換。對于函數(shù)模板:template<typenameT1>T1sum_value(T1x,T1y,T1z) { returnx+y+z; }如果用以下的方式來調(diào)用:cout<<sum_value(2,3.2,21)<<endl;在編譯時會出現(xiàn)編譯錯誤。也就是參數(shù)T1,不可以既是整型,又是實型。例如,需要為sum_value(2,3.2,21)單獨定義對應(yīng)類形變量的比較函數(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ù)模板的匹配過程是按照以下的順序來進(jìn)行的:①首先尋找函數(shù)名和參數(shù)能準(zhǔn)確匹配的非模板函數(shù);②如果沒有找到,選擇參數(shù)可以匹配的函數(shù)模板;③如果還不成功,通過參數(shù)自動轉(zhuǎn)換,選擇非模板函數(shù)。5.5局部變量和全局變量變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義的變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語句內(nèi)。5.5.1局部作用域和局部變量【例5-12】分析下面程序的運行結(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ù)外部定義的變量。作用域:從定義變量的位置開始到本源文件結(jié)束。如在其作用域內(nèi)的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內(nèi),同名全局變量暫時不起作用?!纠?-13】分析下面程序的運行結(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變量的生存期和存儲類別5.6.1變量的生存期變量的生存期:變量在內(nèi)存中占據(jù)存儲空間的時間。程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)存儲分配動態(tài)存儲變量靜態(tài)存儲變量5.6.2變量的存儲類別變量的屬性數(shù)據(jù)類型:決定為變量分配內(nèi)存單元的長度,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲類別:決定了變量的生存期,給它分配在哪個存儲區(qū)。變量定義語句的一般形式存儲類別數(shù)據(jù)類型變量名1,…,變量名n;auto(自動的)register(寄存器的)static(靜態(tài)的)

extern(外部的)1.自動變量(auto類別)main()

{int

x,y;…}main()

{auto

int

x,y;…}自動變量等價可省局部變量可以定義為自動變量。⑴內(nèi)存分配調(diào)用函數(shù)或執(zhí)行分程序時在動態(tài)存儲區(qū)為其分配存儲單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。⑵變量的初值定義變量時若沒賦初值,變量的初值不確定;如果賦初值則每次函數(shù)被調(diào)用時執(zhí)行一次賦值操作。⑶生存期在函數(shù)或分程序執(zhí)行期間。⑷作用域自動變量所在的函數(shù)內(nèi)或分程序內(nèi)。自動變量【例5-15】自動變量的使用。#include<iostream>usingnamespacestd;int

f(inta){

ints=5; /*等價于:autoints=5;*/ s+=a; returns;}intmain(){

int

i,a=1; /*等價于:autoint

i,a=1;*/

for(i=0;i<3;i++) { a+=f(a);

cout<<a<<endl; } return0;}運行結(jié)果:719432.靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。static

int

a;main(){floatx,y;…}f(){static

int

b=1;……}全局靜態(tài)變量局部靜態(tài)變量自動變量不能?、艃?nèi)存分配編譯時,將其分配在內(nèi)存的靜態(tài)存儲區(qū)中,程序運行結(jié)束釋放該單元。⑵靜態(tài)變量的初值若定義時未賦初值,在編譯時,系統(tǒng)自動賦初值為0;若定義時賦初值,則僅在編譯時賦初值一次,程序運行后不再給變量賦初值。⑶生存期整個程序的執(zhí)行期間。⑷作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結(jié)束。靜態(tài)變量【例5-16】靜態(tài)變量的使用。#include<

溫馨提示

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

評論

0/150

提交評論