版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第四章過程抽象--函數(shù)本章內(nèi)容子程序的概念
C++的函數(shù)變量的局部性標(biāo)識符的作用域遞歸函數(shù)函數(shù)名重載帶缺省值的形式參數(shù)內(nèi)聯(lián)函數(shù)條件編譯標(biāo)準(zhǔn)庫函數(shù)子程序子程序是取了名的一段程序代碼,在程序中通過名字來使用它們。數(shù)據(jù)傳遞全局變量(不好):所有子程序都能訪問到的變量。參數(shù):形式參數(shù)(形參)和實(shí)在參數(shù)(實(shí)參)。傳遞方式有:值傳遞:把實(shí)參的值復(fù)制一份給形參。地址或引用傳遞:把實(shí)參的地址傳給形參。子程序的作用:減少重復(fù)代碼,節(jié)省勞動力;實(shí)現(xiàn)過程抽象,即,一個子程序代表一個功能,使用者只需知道所使用的子程序的功能,而不必關(guān)心它們是如何實(shí)現(xiàn)的。為解決復(fù)雜程序設(shè)計問題提供了一種手段。函數(shù)函數(shù)是C++提供的用于實(shí)現(xiàn)子程序的語言成分。函數(shù)的定義:
<返回值類型><函數(shù)名>(<形式參數(shù)表>)<函數(shù)體><返回值類型>描述了函數(shù)返回值的類型,可以為任意的C++數(shù)據(jù)類型。當(dāng)返回值類型為void時,它表示函數(shù)沒有返回值。<函數(shù)名>用于標(biāo)識函數(shù)的名字,用標(biāo)識符表示。<形式參數(shù)表>描述函數(shù)的形式參數(shù),由零個、一個或多個形參說明(用逗號隔開)構(gòu)成,形參說明的格式為:
<類型><形參名><函數(shù)體>
為一個<復(fù)合語句>,用于實(shí)現(xiàn)相應(yīng)函數(shù)的功能。函數(shù)體內(nèi)可以包含return語句,格式為:return<表達(dá)式>;return;當(dāng)函數(shù)體執(zhí)行到return語句時,函數(shù)立即返回到調(diào)用者。在函數(shù)體中不能用goto語句轉(zhuǎn)出函數(shù)體。函數(shù)的例子int
factorial(intn)//求n的階乘{(lán) int
i,f=1; for(i=2;i<=n;i++)f*=i; returnf;}函數(shù)的調(diào)用
對于定義的一個函數(shù),必須要調(diào)用它,它的函數(shù)體才會執(zhí)行。函數(shù)調(diào)用的格式如下:<函數(shù)名>(<實(shí)在參數(shù)表>)<實(shí)在參數(shù)表>由零個、一個或多個表達(dá)式構(gòu)成(逗號分割)實(shí)參的個數(shù)和類型應(yīng)與相應(yīng)函數(shù)的形參相同。類型如果不同,編譯器會試圖進(jìn)行隱式轉(zhuǎn)換。不能用goto語句從函數(shù)外轉(zhuǎn)入函數(shù)體函數(shù)調(diào)用的例子......intmain(){ intx;
cout<<"請輸入一個正整數(shù):";
cin>>x;
cout<<"Factorialof"<<x<<"is" <<factorial(x)//調(diào)用階乘函數(shù)
<<endl; return0;}函數(shù)調(diào)用的執(zhí)行過程計算實(shí)參的值(對于多個實(shí)參,C++沒有規(guī)定計算次序);把實(shí)參分別傳遞給被調(diào)用函數(shù)的形參;執(zhí)行函數(shù)體;函數(shù)體中執(zhí)行return語句返回函數(shù)調(diào)用點(diǎn),調(diào)用點(diǎn)獲得返回值(如果有返回值)并執(zhí)行調(diào)用之后的操作。函數(shù)聲明程序中調(diào)用的所有函數(shù)都要有定義。如果函數(shù)定義在其它文件(如:C++的標(biāo)準(zhǔn)庫)中或定義在本源文件中使用點(diǎn)之后,則在調(diào)用前需要對被調(diào)用的函數(shù)進(jìn)行聲明。函數(shù)聲明的格式如下:<返回值類型><函數(shù)名>(<形式參數(shù)表>);//函數(shù)原型extern<返回值類型><函數(shù)名>(<形式參數(shù)表>);在函數(shù)聲明中,<形式參數(shù)表>中可以只列出形參的類型而不寫形參名?;诠δ芊纸夂蛷?fù)合的程序設(shè)計人們在設(shè)計一個復(fù)雜的程序時,經(jīng)常會用到功能分解和復(fù)合兩種手段:功能分解:在進(jìn)行程序設(shè)計時,首先把程序的功能分解成若干子功能,每個子功能又可以分解成若干子功能,等等,從而形成了一種自頂向下(top-down)、逐步精化(step-wise)的設(shè)計過程。功能復(fù)合:把已有的(子)功能逐步組合成更大的(子)功能,從而形成一種自底向上(bottom-up)的設(shè)計過程。子程序?yàn)榛诠δ芊纸夂蛷?fù)合的程序設(shè)計提供了基礎(chǔ):一個子程序代表了一種功能。例:用函數(shù)實(shí)現(xiàn)求小于n的所有素數(shù)。#include<iostream>#include<cmath>usingnamespacestd;bool
is_prime(intn);//函數(shù)聲明voidprint_prime(intn,intcount);//函數(shù)聲明int
main(){ int
i,n,count=1;
cout<<"請輸入一個正整數(shù):"
cin>>n;//從鍵盤輸入一個正整數(shù)
if(n<2)return-1;
cout<<2<<",";//輸出第一個素數(shù)
for(i=3;i<n;i+=2) { if(is_prime(i)) { count++;
print_prime(i,count); }
}
cout<<endl; return0;}bool
is_prime(intn){ int
i,j; for(i=2,j=sqrt(n);i<=j;i++) if(n%i==0)returnfalse; returntrue;}voidprint_prime(intn,intcount){ cout<<n<<','; if(count%6==0)cout<<endl;}函數(shù)的參數(shù)傳遞C++提供了兩種參數(shù)傳遞機(jī)制:值傳遞地址和引用傳遞C++默認(rèn)的參數(shù)傳遞方式是值傳遞。值傳遞在函數(shù)調(diào)用時,采用類似賦值操作的形式把實(shí)參的值傳給形參。函數(shù)執(zhí)行過程中,通過形參獲得實(shí)參的值,函數(shù)體中對形參值的改變不會影響相應(yīng)實(shí)參的值。值參數(shù)傳遞的例子#include<iostream>usingnamespacestd;doublepower(doublex,intn);intmain(){ doublea=3.0,c;
intb=4; c=power(a,b);
cout<<a<<","<<b<<","<<c<<endl; return0;}doublepower(doublex,intn){ if(x==0)return0; doubleproduct=1.0; if(n>=0) while(n>0) { product*=x; n--; } else while(n<0) { product/=x; n++; } returnproduct;}執(zhí)行main時,產(chǎn)生三個變量(分配內(nèi)存空間)a、b和c:
a:3.0b:4c:?調(diào)用power函數(shù)時,又產(chǎn)生三個個變量x、n和product,然后分別用a、b以及1.0對它們初始化:
a:3.0b:4c:? x:3.0n:4product:1.0函數(shù)power中的循環(huán)結(jié)束后(函數(shù)返回前):
a:3.0b:4c:? x:3.0n:0product:81.0函數(shù)power返回后:
a:3.0b:4c:81.0變量的局部性在C++中,根據(jù)變量的定義位置,把變量分成:全局變量和局部變量。
全局變量是指在函數(shù)外部定義的變量,它們一般能被程序中的所有函數(shù)使用(靜態(tài)的全局變量除外)。局部變量是指在復(fù)合語句中定義的變量,它們只能在定義它們的復(fù)合語句(包括內(nèi)層的復(fù)合語句)中使用。全局變量和局部變量的例子intx=0;//全局變量voidf(){ inty=0;//局部變量
x++;//OK y++;//OK a++;//Error}intmain(){ inta=0;//局部變量
f(); a++;//OK x++;//OK y++;//Error while(x<10) {intb=0;//局部變量
a++;//OK b++;//OK x++;//OK } b++;//Error return0;}變量的生存期(存儲分配)把程序運(yùn)行時一個變量占有內(nèi)存空間的時間段稱為該變量的生存期。C++把變量的生存期分為:靜態(tài):內(nèi)存空間從程序開始執(zhí)行時就進(jìn)行分配,直到程序結(jié)束才收回它們的空間。全局變量具有靜態(tài)生存期。自動:內(nèi)存空間在程序執(zhí)行到定義它們的復(fù)合語句(包括函數(shù)體)時才分配,當(dāng)定義它們的復(fù)合語句執(zhí)行結(jié)束時,它們的空間將被收回。局部變量和函數(shù)的參數(shù)一般具有自動生存期。動態(tài):內(nèi)存空間在程序中顯式地用new操作或malloc庫函數(shù)分配、用delete操作或free庫函數(shù)收回。動態(tài)變量具有動態(tài)生存期。
存儲類修飾符在定義局部變量時,可以為它們加上存儲類修飾符來指出它們的生存期。auto:使局部變量具有自動生存期。局部變量的默認(rèn)存儲類為auto。static:使局部變量具有靜態(tài)生存期,它只在函數(shù)第一次調(diào)用時進(jìn)行初始化,以后調(diào)用中不再進(jìn)行初始化,它的值為上一次函數(shù)調(diào)用結(jié)束時的值。register:使局部變量也具有自動生存期,由編譯程序根據(jù)CPU寄存器的使用情況來決定是否存放在寄存器中。voidf(){intx=0;staticinty=1;registerintz=0;x++;y++;z++;
cout<<x<<y<<z<<endl;}第一次調(diào)用f時,輸出:121第二次調(diào)用f時,輸出:131程序?qū)嶓w在內(nèi)存中的安排靜態(tài)數(shù)據(jù)區(qū)用于全局變量、static存儲類的局部變量以及常量的內(nèi)存分配。代碼區(qū)用于存放程序的指令,對C++程序而言,代碼區(qū)存放的是所有函數(shù)代碼;棧區(qū)用于auto存儲類的局部變量、函數(shù)的形式參數(shù)以及函數(shù)調(diào)用時有關(guān)信息(如:函數(shù)返回地址等)的內(nèi)存分配;堆區(qū)用于動態(tài)變量的內(nèi)存分配。靜態(tài)數(shù)據(jù)區(qū)代碼區(qū)棧區(qū)堆區(qū)C++程序的多模塊結(jié)構(gòu)邏輯上,一個C++程序由一些全局函數(shù)(區(qū)別于類定義中的成員函數(shù))、全局常量、全局變量/對象以及類的定義構(gòu)成,其中必須有且僅有一個名字為main的全局函數(shù)。函數(shù)內(nèi)部可以包含形參、局部常量、局部變量/對象的定義以及語句。物理上,可以按某種規(guī)則對構(gòu)成C++程序的各個邏輯單位(全局函數(shù)、全局常量、全局變量/對象、類等)的定義進(jìn)行分組,分別把它們放在若干個源文件中,構(gòu)成程序模塊。程序模塊是為了便于從物理上對程序進(jìn)行組織、管理和理解,便于多人合作開發(fā)一個程序。程序模塊是可單獨(dú)編譯的程序單位。C++模塊的構(gòu)成一個C++模塊一般包含兩個部分:接口(.h文件):給出在本模塊中定義的、提供給其它模塊使用的一些程序?qū)嶓w(如:函數(shù)、全局變量等)的聲明;實(shí)現(xiàn)(.cpp文件):模塊的實(shí)現(xiàn)給出了模塊中的程序?qū)嶓w的定義。下面是一個由三個模塊(file1、file2和main)構(gòu)成的C++程序。//file1.hexternintx;//全局變量x的聲明externdoubley;//全局變量y的聲明intf();//全局函數(shù)f的聲明//file1.cppintx=1;//全局變量x的定義doubley=2.0;//全局變量y的定義intf()//全局函數(shù)f的定義{ intm;//局部變量m的定義
...... m+=x;//語句
...... returnm;}//file2.hvoidg();//全局函數(shù)g的聲明//file2.cpp#include"file1.h"http://把文件file1.h中的內(nèi)容包含進(jìn)來voidg()//全局函數(shù)g的定義{ doublez;//局部變量z的定義
...... z=y+10;//語句
......}//main.cpp#include"file1.h"http://把文件file1.h中的內(nèi)容包含進(jìn)來#include"file2.h"http://把文件file2.h中的內(nèi)容包含進(jìn)來intmain()//全局函數(shù)main的定義{ doubler;//局部變量r的定義
...... r=x+y*f();//語句
...... g();//語句
......}標(biāo)識符的作用域?yàn)榱藢Τ绦蛑械膶?shí)體的名字進(jìn)行管理,引進(jìn)了標(biāo)識符的作用域的概念。一個定義了的標(biāo)識符的有效范圍(能被訪問的程序段)稱為該標(biāo)識符的作用域。C++把標(biāo)識符的作用域分成若干類,其中包括:局部作用域全局作用域文件作用域函數(shù)作用域函數(shù)原型作用域類作用域名空間作用域局部作用域在函數(shù)定義或復(fù)合語句中、從標(biāo)識符的定義點(diǎn)開始到函數(shù)定義或復(fù)合語句結(jié)束之間的程序段。C++中的局部常量名、局部變量名/對象名以及函數(shù)的形參名具有局部作用域。如果在一個標(biāo)識符的局部作用域中包含內(nèi)層復(fù)合語句,并且在該內(nèi)層復(fù)合語句中定義了一個同名的不同實(shí)體,則外層定義的標(biāo)識符的作用域應(yīng)該是從其潛在作用域中扣除內(nèi)層同名標(biāo)識符的作用域之后所得到的作用域。voidf(){ ...x...//Error
intx;//外層x的定義
...x...//外層的x while(...x...)//外層的x { ...x...//外層的x doublex;//內(nèi)層x的定義
...x...//內(nèi)層的x } ...x...//外層的x}全局作用域在函數(shù)級定義的標(biāo)識符具有全局作用域。全局變量名/對象名、全局函數(shù)名和全局類名的作用域一般具有全局作用域,它們在整個程序中可用。如果在某個局部作用域中定義了與某個全局標(biāo)識符同名的標(biāo)識符,則該全局標(biāo)識符的作用域應(yīng)扣掉與之同名的局部標(biāo)識符的作用域。在局部標(biāo)識符的作用域中若要使用與其同名的全局標(biāo)識符,則需要用全局域選擇符(::)對全局標(biāo)識符進(jìn)行修飾(受限)。把全局標(biāo)識符的聲明放在某個.h文件中,在需要使用這些全局標(biāo)識符的源文件中用#include編譯預(yù)處理命令把聲明文件包含進(jìn)來。
doublex;//外層x的定義voidf(){ intx;//內(nèi)層x的定義
...x...//內(nèi)層的x ...::x...//外層的x}文件作用域在全局標(biāo)識符的定義中加上static修飾符,則該全局標(biāo)識符就成了具有文件作用域的標(biāo)識符,它們只能在定義它們的源文件中使用。C++中的關(guān)鍵詞static有兩個不同的含義。在局部變量的定義中,static修飾符用于指定局部變量采用靜態(tài)存儲分配;而在全局標(biāo)識符的定義中,static修飾符用于把全局標(biāo)識符的作用域改變?yōu)槲募饔糜颉?/p>
一般情況下,具有全局作用域的標(biāo)識符主要用于標(biāo)識被程序各個模塊共享的程序?qū)嶓w,而具有文件作用域的標(biāo)識符用于標(biāo)識在一個模塊內(nèi)部共享的程序?qū)嶓w。//file1.cppstaticinty;//文件作用域staticvoidf()//文件作用域{......}//file2.cppexterninty;externvoidf();voidg(){...y...//Errorf();//Error}函數(shù)作用域語句標(biāo)號是唯一具有函數(shù)作用域的標(biāo)識符,它們在定義它們的函數(shù)體中的任何地方都可以訪問。函數(shù)作用域與局部作用域的區(qū)別是:函數(shù)作用域包括整個函數(shù),而局部作用域是從定義點(diǎn)開始到函數(shù)定義或復(fù)合語句結(jié)束。在函數(shù)體中,一個語句標(biāo)號只能定義一次,即使是在內(nèi)層的復(fù)合語句中,也不能再定義與外層相同的語句標(biāo)號。voidf(){ ......
gotoL;//OK ...... L:... ......
gotoL;//OK ......}voidg(){ ......
gotoL;//Error ......}名空間作用域?qū)τ谝粋€多文件構(gòu)成的程序,有時會面臨一個問題:在一個源文件中要用到兩個分別在另外兩個源文件中定義的不同全局程序?qū)嶓w(如:全局函數(shù)),而這兩個全局程序?qū)嶓w的名字相同。C++提供了名空間(namespace)設(shè)施來解決上述的名沖突問題。在一個名空間中定義的全局標(biāo)識符,其作用域?yàn)樵撁臻g。當(dāng)在一個名空間外部需要使用該名空間中定義的全局標(biāo)識符時,可用該名空間的名字來修飾或受限。3、//模塊2namespaceB{ intx=0; voidf() {...... }}...A::x...//A中的xA::f();//A中的f...B::x...//B中的xB::f();//B中的fusingnamespaceA;...x...//A中的xf();//A中的f...B::x...//B中的xB::f();//B中的fusingA::f;...A::x...//A中的x
f();//A中的f...B::x...//B中的xB::f();//B中的f//模塊31、2、遞歸函數(shù)函數(shù)的調(diào)用是可以嵌套的。如果一個函數(shù)在其函數(shù)體中直接或間接地調(diào)用了自己,則該函數(shù)稱為遞歸函數(shù)。
直接遞歸voidf(){..........f()..........}間接遞歸externvoidg();voidf(){..........g()..........}voidg(){.........f().........}遞歸函數(shù)的作用在程序設(shè)計中經(jīng)常需要實(shí)現(xiàn)重復(fù)性的操作。循環(huán)為實(shí)現(xiàn)重復(fù)操作提供了一種途徑。實(shí)現(xiàn)重復(fù)操作的另一個途徑是采用遞歸函數(shù)?!胺侄沃保―ivideandConquer)設(shè)計方法:把一個問題分解成若干個子問題,而每個子問題的性質(zhì)與原問題相同,只是在規(guī)模上比原問題要小。每個子問題的求解過程可以采用與原問題相同的方式來進(jìn)行。遞歸函數(shù)為上述設(shè)計方法提供了一種自然、簡潔的實(shí)現(xiàn)機(jī)制例:求第n個fibonacci
數(shù)(遞歸解法)int
fib(intn){ if(n==1) return0; elseif(n==2) return1; else returnfib(n-2)+fib(n-1);}遞歸函數(shù)的執(zhí)行過程//用遞歸函數(shù)求n!
int
f(intn){ if(n==0) return1; else returnn*f(n-1);}遞歸條件和結(jié)束條件在定義遞歸函數(shù)時,一定要對兩種情況給出描述:遞歸條件。指出何時進(jìn)行遞歸調(diào)用,它描述了問題求解的一般情況,包括:分解和綜合過程。結(jié)束條件。指出何時不需遞歸調(diào)用,它描述了問題求解的特殊情況或基本情況例:解漢諾塔問題
漢諾塔問題:有A,B,C三個柱子,柱子A上穿有n個大小不同的圓盤,大盤在下,小盤在上?,F(xiàn)要把柱子A上的所有圓盤移到柱子B上,要求每次只能移動一個圓盤,且大盤不能放在小盤上,移動時可借助柱子C。編寫一個C++函數(shù)給出移動步驟,如:n=3時,移動步驟為:A
B,A
C,B
C,A
B,C
A,C
B,A
B。
ABC當(dāng)n=1時,只要把圓盤從A移至B就可以了(輸出:A
B)。而當(dāng)n大于1時,我們可以把該問題分解成下面的三個子問題:把n-1個圓盤從柱子A移到柱子C。把第n個圓盤從柱子A移到柱子B。把n-1個圓盤從柱子C移到柱子B。上面的子問題1和3與原問題相同,只是盤子的個數(shù)少了一個;子問題2是移動一個盤子的簡單問題。#include<iostream>usingnamespacestd;voidhanoi(char
x,char
y,char
z,intn)//把n個圓盤從x表示的
//柱子移至y所表示的柱子。{ if(n==1)
cout<<"1:"<<x<<"→"<<y<<endl;//把第1個
//盤子從x表示的柱子移至y所表示的柱子。
else { hanoi(x,z,y,n-1);//把n-1個圓盤從x表示的柱子移至
//z所表示的柱子。
cout<<n<<":"<<x<<"→"<<y<<endl; //把第n個圓盤從x表示的柱子移至y所表示的柱子。
hanoi(z,y,x,n-1);//把n-1個圓盤從z表示的柱子移至
//y所表示的柱子。
}}遞歸與循環(huán)的選擇對于一些遞歸定義的問題,用遞歸函數(shù)來解決會顯得比較自然和簡潔,而用循環(huán)來解決這樣的問題,有時會很復(fù)雜,不易設(shè)計和理解。在實(shí)現(xiàn)數(shù)據(jù)的操作上,它們有一點(diǎn)不同:循環(huán)是在同一組變量上進(jìn)行重復(fù)操作(循環(huán)常常又稱為迭代)遞歸則是在不同的變量組(屬于遞歸函數(shù)的不同實(shí)例)上進(jìn)行重復(fù)操作。遞歸的缺陷:由于遞歸表達(dá)的重復(fù)操作是通過函數(shù)調(diào)用來實(shí)現(xiàn)的,而函數(shù)調(diào)用是需要開銷的;??臻g的大小也會限制遞歸的深度。遞歸算法有時會出現(xiàn)重復(fù)計算。函數(shù)名重載對于一些功能相同、參數(shù)類型或個數(shù)不同的函數(shù),有時給它們?nèi)∠嗤拿謺硎褂蒙系姆奖?。例如,把下面的函?shù):voidprint_int(inti){......}voidprint_double(doubled){......}voidprint_char(charc){......}voidprint_A(Aa){......}//A為自定義類型定義為:voidprint(inti){......}voidprint(doubled){......}voidprint(charc){......}voidprint(Aa){......}上述的函數(shù)定義形式稱為函數(shù)名重載。對重載函數(shù)調(diào)用的綁定確定一個對重載函數(shù)的調(diào)用對應(yīng)著哪一個重載函數(shù)定義的過程稱為綁定(binding,又稱定聯(lián)、聯(lián)編、捆綁)。在編譯時刻由編譯程序根據(jù)實(shí)參與形參的匹配情況來決定。從形參個數(shù)與實(shí)參個數(shù)相同的重載函數(shù)中按下面的規(guī)則選擇一個:精確匹配提升匹配標(biāo)準(zhǔn)轉(zhuǎn)換匹配自定義轉(zhuǎn)換匹配匹配失敗精確匹配類型相同對實(shí)參進(jìn)行微小的類型轉(zhuǎn)換:數(shù)組變量名->數(shù)組首地址函數(shù)名->函數(shù)首地址等等例如,對于下面的重載函數(shù)定義:
voidprint(int); voidprint(double); voidprint(char);下面的函數(shù)調(diào)用:
print(1);綁定到函數(shù):voidprint(int); print(1.0);綁定到函數(shù):voidprint(double);
print('a');綁定到函數(shù):voidprint(char);提升匹配按整型提升規(guī)則提升把float提升到double把double提升到longdouble例如,對于下述的重載函數(shù):voidprint(int);voidprint(double);根據(jù)提升匹配,下面的函數(shù)調(diào)用:print('a');綁定到函數(shù):voidprint(int);print(1.0f);綁定到函數(shù):voidprint(double);
標(biāo)準(zhǔn)轉(zhuǎn)換匹配任何算術(shù)類型可以互相轉(zhuǎn)換枚舉類型可以轉(zhuǎn)換成任何算術(shù)類型零可以轉(zhuǎn)換成任何算術(shù)類型或指針類型任何類型的指針可以轉(zhuǎn)換成void*派生類指針可以轉(zhuǎn)換成基類指針每個標(biāo)準(zhǔn)轉(zhuǎn)換都是平等的。
例如,對于下述的重載函數(shù):voidprint(char);voidprint(char*);根據(jù)標(biāo)準(zhǔn)轉(zhuǎn)換匹配,下面的函數(shù)調(diào)用:print(1);綁定到函數(shù):voidprint(char);print(0);綁定失敗帶缺省值的形式參數(shù)在C++中允許在定義或聲明函數(shù)時,為函數(shù)的某些參數(shù)指定默認(rèn)值。如果調(diào)用這些函數(shù)時沒有提供相應(yīng)的實(shí)參,則相應(yīng)的形參采用指定的默認(rèn)值,否則相應(yīng)的形參采用調(diào)用者提供的實(shí)參值。例如,對于下面的函數(shù)聲明:voidprint(intvalue,intbase=10);下面的調(diào)用:print(28);//28傳給value;10傳給baseprint(32,2);//28傳給value;2傳給base在指定函數(shù)參數(shù)的默認(rèn)值時,應(yīng)注意下面幾點(diǎn):有默認(rèn)值的形參應(yīng)處于形參表的右部。例如:voidf(inta,intb=1,intc=0);//OKvoidf(inta,intb=1,intc);//Error
對參數(shù)默認(rèn)值的指定只在函數(shù)聲明處有意義。在不同的源文件中,對同一個函數(shù)的聲明可以對它的同一個參數(shù)指定不同的默認(rèn)值;在同一個源文件中,對同一個函數(shù)的聲明只能對它的每一個參數(shù)指定一次默認(rèn)值。
解決小函數(shù)的低效問題由于函數(shù)調(diào)用是需要開銷的,特別是對一些小函數(shù)的頻繁調(diào)用將使程序的效率有很大的降低。C++提供了兩種解決上述問題的辦法:宏定義內(nèi)聯(lián)函數(shù)宏定義在C++中,利用一種編譯預(yù)處理命令:宏定義可以實(shí)現(xiàn)類似函數(shù)的功能:#define凵<宏名>(<參數(shù)表>)凵<文字串>例如:#define凵max(a,b)凵(((a)>(b))?(a):(b))cout<<max(x,y);宏定義是文字替換!宏定義的不足之處有時會出現(xiàn)重復(fù)計算。例如:#define凵max(a,b)凵(((a)>(b))?(a):(b))max(x+1,y*2)將被替換成:(((x+1)>(y*2))?(x+1):(y*2))不進(jìn)行參數(shù)類型檢查和轉(zhuǎn)換。
不利于一些工具對程序的處理。
內(nèi)聯(lián)函數(shù)C++提供了另外一種解決函數(shù)調(diào)用效率不高問題的設(shè)施:內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)是指在函數(shù)定義中,可以在函數(shù)返回類型之前加上一個關(guān)鍵詞inline,例如:inlineint
max(inta,intb){ returna>b?a:b;}內(nèi)聯(lián)函數(shù)的作用是建議編譯程序把該函數(shù)的函數(shù)體展開到調(diào)用點(diǎn)。內(nèi)聯(lián)函數(shù)形式上屬于函數(shù),它遵循函數(shù)的一些規(guī)定,如:參數(shù)類型檢查與轉(zhuǎn)換。使用內(nèi)聯(lián)函數(shù)時應(yīng)注意以下幾點(diǎn):編譯程序?qū)?nèi)聯(lián)函數(shù)的限制。內(nèi)聯(lián)函數(shù)名具有文件作用域。編譯預(yù)處理命令C++程序中可以寫一些供編譯程序使用的命令:編譯預(yù)處理命令。編譯預(yù)處理命令不是C++程序所要完成的功能,而是用于對編譯過程給出指導(dǎo),其功能由編譯預(yù)處理系統(tǒng)來完成。編譯預(yù)處理命令主要有:文件包含命令(#include)宏定義(#define)命令條件編譯命令條件編譯編譯程序根據(jù)不同的情況來選擇需編譯的程序代碼。條件編譯的作用:基于多環(huán)境的程序編制程序調(diào)試基于多環(huán)境的程序編制#ifdefUNIX ......//適合于UNIX環(huán)境的代碼#else ......//適合于其它環(huán)境的代碼#endif......//適合于各種環(huán)境的代碼程序調(diào)試加入調(diào)試信息#ifdefDEBUG......//調(diào)試信息#endif利用標(biāo)準(zhǔn)庫#include<cassert>//或<assert.h>......assert(x==1);條件編譯命令的常用格式#ifdef/#ifndef<宏名> <程序
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職第四學(xué)年(空調(diào)制冷設(shè)備)優(yōu)化設(shè)計階段測試題及答案
- 2025年大學(xué)大四(汽車檢測與維修技術(shù))汽車電氣系統(tǒng)檢修綜合測試試題及答案
- 2025年中職漢語言文學(xué)(現(xiàn)代漢語)試題及答案
- 2026年個人與團(tuán)隊的共同成長扁平化總結(jié)
- 消防安全評價師職業(yè)指南
- 光伏類培訓(xùn)課件
- 2025山東濰坊天立學(xué)校教師招聘備考題庫及完整答案詳解
- 2026年1月重慶市綦江區(qū)關(guān)壩鎮(zhèn)人民政府公益性崗位招聘20人備考題庫及一套答案詳解
- 2026年西安理工大學(xué)附屬小學(xué)教師招聘備考題庫及完整答案詳解一套
- 2025-2026學(xué)年上學(xué)期廣東省興寧市實(shí)驗(yàn)學(xué)校、寧江中學(xué)九年級教學(xué)質(zhì)量評估試題(道德與法治)
- 2025年二年級上冊語文期末專項復(fù)習(xí)-按課文內(nèi)容填空默寫表(含答案)
- 登高作業(yè)監(jiān)理實(shí)施細(xì)則
- 2025年婦產(chǎn)科副高試題庫及答案
- 2025食品機(jī)械行業(yè)智能化分析及技術(shù)升級趨勢與投資可行性評估報告
- 2025年度黨委黨建工作總結(jié)
- 《經(jīng)濟(jì)法學(xué)》2025-2025期末試題及答案
- CAICV智能網(wǎng)聯(lián)汽車遠(yuǎn)程升級(OTA)發(fā)展現(xiàn)狀及建議
- 新質(zhì)生產(chǎn)力在體育產(chǎn)業(yè)高質(zhì)量發(fā)展中的路徑探索
- 2025年公民素質(zhì)養(yǎng)成知識考察試題及答案解析
- 老年人營養(yǎng)和飲食
- 2025年濟(jì)南市九年級中考語文試題卷附答案解析
評論
0/150
提交評論