版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章函數(shù)與運(yùn)算符重載5.1三次方程求根程序設(shè)計(jì)5.2函數(shù)說明與使用5.3函數(shù)嵌套與遞歸5.4函數(shù)與運(yùn)算符重載5.5函數(shù)與C++程序結(jié)構(gòu)5.6程序?qū)嵗?/p>
1第1頁5.1三次方程求根程序設(shè)計(jì)
--計(jì)算三次方程x3+px+q=0一個(gè)實(shí)根公式為xr=為了從系數(shù)p、q計(jì)算實(shí)根xr,把公式計(jì)算分解為下面幾步:
1)令實(shí)數(shù)xr=A+B;2)令實(shí)數(shù)A,B分別為實(shí)數(shù)R,S立方根:3)令R=-q/2+a,S=-q/2-a;(5.2)4)令a=sqrt((q/2)*(q/2)+(q/3)*(q/3)*(q/3));實(shí)際計(jì)算過程為:用(4)計(jì)算得到a;用(3)計(jì)算得到R和S;求出R和S立方根A和B;最終得到實(shí)根xr。
2第2頁5.1三次方程求根程序設(shè)計(jì)計(jì)算立方根迭代公式Floatcuberoot(floatx){//準(zhǔn)確到小數(shù)點(diǎn)后6位floatroot,croot;constfloateps=1e-6;croot=x;do{
root=croot;
croot=(2*root+x/(root*root))/3;}
while(fabs(croot-root)>eps);
return(croot);}
3第3頁5.1三次方程求根程序設(shè)計(jì)#include<iostream.h>//program5-1#include<math.h>
floatcuberoot(float);
voidmain(void){ floatp,q,xr; cout<<″Inputparametersp,q:″; cin>>p>>q; floata=sqrt((q/2)*(q/2)+(q/3)*(q/3)*(q/3)); xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);
cout<<endl<<″Therealrootoftheequationis″<<xr; } floatcuberoot(floatx){…… }
4第4頁5.1三次方程求根程序設(shè)計(jì)
書本p129顯示了不使用函數(shù)程序。其中croot立方根運(yùn)算進(jìn)行了兩次,所以該計(jì)算程序要重復(fù)兩次,當(dāng)程序較長,或計(jì)算次數(shù)更多時(shí),采取“子程序”方案能夠大大縮短程序長度。尤其是當(dāng)程序比較復(fù)雜時(shí),能夠使得程序顯得清楚,在program5_1中,main()中不包括計(jì)算立方根細(xì)節(jié),顯得簡練,而在cuberoot()中只處理一個(gè)浮點(diǎn)數(shù)立方根計(jì)算,也很清楚。另外,還能夠把立方根計(jì)算與C++語言中運(yùn)算符和標(biāo)準(zhǔn)函數(shù)對(duì)應(yīng)起來,當(dāng)在程序中對(duì)于cuberoot(y)給出了定義之后,就能夠在主函數(shù)或其它用戶定義函數(shù)中,像運(yùn)算符或標(biāo)準(zhǔn)函數(shù)那樣使用了,如cuberoot(x)使用與a+b,sin(x)使用沒有什么區(qū)分。5第5頁5.2函數(shù)說明與使用
--參看書p1305.2節(jié)
C++程序允許兩種函數(shù)說明語句形式,我們把它們分別稱為函數(shù)原型(或函數(shù)申明)和函數(shù)定義。1.函數(shù)原型函數(shù)原型(亦稱函數(shù)申明)用來指出函數(shù)名稱,類型和參數(shù),其格式為: [〈屬性說明〉]〈類型〉〈函數(shù)名〉(〈參數(shù)表〉);
intadd(inta,intb);
inlinevoidswap(float&s,float&t);
voidprint(char*);
6第6頁5.2.1函數(shù)說明
屬性說明:可缺省,普通能夠是下面關(guān)鍵字之一:inline,static,virtual,friend等。 inline表示該函數(shù)為內(nèi)聯(lián)函數(shù); static表示該函數(shù)為靜態(tài)函數(shù);
virtual表示該函數(shù)為虛函數(shù);
friend表示該函數(shù)為某類(class)友元函數(shù)。類型:指函數(shù)返回類型。函數(shù)名:一個(gè)標(biāo)識(shí)符。參數(shù)表:它可能為空,void或〈類型〉〈參數(shù)名〉,〈類型〉〈參數(shù)名〉…形式。
main(),print(void),cuberoot(floatx),add(inta,intb)
7第7頁5.2.1函數(shù)說明
2.函數(shù)定義函數(shù)定義與函數(shù)原型主要區(qū)分是它還包含函數(shù)體,其格式為:[〈屬性說明〉]〈類型〉〈函數(shù)名〉(〈參數(shù)表〉)〈函數(shù)體〉屬性說明,返回類型,函數(shù)名與函數(shù)原型一致,參數(shù)表中不可省略參數(shù)名。
函數(shù)體:由{和}括起來復(fù)合語句即程序塊。program5_1最終12行就是一個(gè)函數(shù)定義。8第8頁函數(shù)分類方法
1從使用角度分類
2從函數(shù)形式分類9第9頁
(1)從使用角度分類從使用角度劃分,可將函數(shù)分為:系統(tǒng)預(yù)定義標(biāo)準(zhǔn)庫函數(shù)(如,sin,abs等),以及由用戶自定義函數(shù)。程序中可直接使用(調(diào)用)系統(tǒng)預(yù)定義標(biāo)準(zhǔn)庫函數(shù),但要求在調(diào)用前使用編譯預(yù)處理指令include將對(duì)應(yīng)頭文件包含進(jìn)來。由用戶自定義函數(shù)與系統(tǒng)預(yù)定義標(biāo)準(zhǔn)庫函數(shù)不一樣點(diǎn)在于,自定義函數(shù)函數(shù)名、參數(shù)個(gè)數(shù)、函數(shù)返回值類型以及函數(shù)所實(shí)現(xiàn)功效等都完全由用戶程序來要求(指定)。10第10頁(2)從函數(shù)形式分類
從函數(shù)形式劃分,可分為無參函數(shù)與有參函數(shù)兩類。對(duì)無參函數(shù)來說,調(diào)用它們時(shí)不需要提供實(shí)際參數(shù);而對(duì)有參函數(shù)進(jìn)行調(diào)用時(shí),必須提供所需個(gè)數(shù)且含有相匹配數(shù)據(jù)類型實(shí)際參數(shù)。11第11頁
無參函數(shù)定義
。
無參函數(shù)定義普通形式
<函數(shù)類型><函數(shù)名>(){ <語句1> ... <語句n> }
通慣用于實(shí)現(xiàn)某種固定功效。比如:
voidprintStar(){...}就自定義了一個(gè)叫做printStar無參函數(shù),比如可用它來實(shí)現(xiàn)打印出一行共10個(gè)“*”固定功效。12第12頁
有參函數(shù)定義普通形式
<函數(shù)類型><函數(shù)名>(<以逗號(hào)分割形參類型及名字表>){ <語句1> ... <語句n> }
經(jīng)過調(diào)用處提供不一樣實(shí)參值來計(jì)算出其對(duì)應(yīng)函數(shù)值、或?qū)崿F(xiàn)某種與傳遞過來那些不一樣值相關(guān)某種功效。比如:
voidprintStar(intk){...}就自定義了一個(gè)叫做printStar含有1個(gè)int型形參k函數(shù),比如可用它來實(shí)現(xiàn)打印出一行共k個(gè)“*”自定義功效。13第13頁5.2.2函數(shù)調(diào)用
函數(shù)調(diào)用是已定義函數(shù)一次實(shí)際運(yùn)行,與某類型一個(gè)變量和后文中某類一個(gè)對(duì)象類似,函數(shù)調(diào)用是函數(shù)定義一個(gè)“實(shí)例”。在C++程序中,除main函數(shù)外,其它任一函數(shù)執(zhí)行都是經(jīng)過在main函數(shù)中直接或間接地調(diào)用該函數(shù)而引發(fā)。調(diào)用一個(gè)函數(shù)就是去執(zhí)行該函數(shù)之函數(shù)體過程。
對(duì)無參函數(shù)進(jìn)行調(diào)用普通形式為:
<函數(shù)名>()
比如:printStar();14第14頁
對(duì)有參函數(shù)進(jìn)行調(diào)用普通形式為:
<函數(shù)名>(<以逗號(hào)分割實(shí)參表>)
比如:printStar(26);
其中函數(shù)說明中參數(shù)稱為形式參數(shù)(形參),函數(shù)調(diào)用中參數(shù)稱為實(shí)際參數(shù)(實(shí)參)。實(shí)參表在參數(shù)個(gè)數(shù)、參數(shù)次序、以及參數(shù)類型等方面要與被調(diào)函數(shù)形參表之間有一個(gè)一一對(duì)應(yīng)相互匹配關(guān)系。編譯器將依據(jù)參數(shù)次序,來逐一實(shí)現(xiàn)實(shí)參加對(duì)應(yīng)形參“結(jié)合”,而后執(zhí)行一遍函數(shù)體(而完成此次函數(shù)調(diào)用)。15第15頁 計(jì)算機(jī)對(duì)函數(shù)進(jìn)行調(diào)用執(zhí)行次序
以Program5-1為例 (1)依據(jù)調(diào)用語句中函數(shù)名(cuberoot)在整個(gè)程序中搜索同名函數(shù)定義; (2)對(duì)實(shí)參數(shù)參數(shù)個(gè)數(shù),類型,次序進(jìn)行查對(duì),判定是否與函數(shù)定義中形參表對(duì)應(yīng)一致,在上例中只有一個(gè)浮點(diǎn)型參數(shù);(3)依據(jù)參數(shù)類型(值參數(shù)或引用參數(shù))進(jìn)行值參數(shù)值傳遞或引用參數(shù)換名,在上例中即是要把實(shí)參表示式值計(jì)算出來賦給形參x;(4)運(yùn)行函數(shù)體代碼;(5)返回調(diào)用點(diǎn),并返回所要求函數(shù)值,即返回計(jì)算結(jié)果croot值。16第16頁
關(guān)于函數(shù)原型一點(diǎn)說明
當(dāng)函數(shù)調(diào)用從書寫次序上先于函數(shù)定義時(shí),C++要求必須事先列出這一函數(shù)函數(shù)原型。
(1)無參函數(shù)定義函數(shù)原型
<函數(shù)類型><函數(shù)名>();
(2)有參函數(shù)定義函數(shù)原型
<函數(shù)類型><函數(shù)名>(<以逗號(hào)分割形參類型及名字表或僅形參類型表>);注意,與函數(shù)定義普通形式相比,相當(dāng)于用分號(hào)代換了函數(shù)體,而成為其對(duì)應(yīng)函數(shù)原型。17第17頁
5.2.3函數(shù)返回函數(shù)返回完成兩項(xiàng)任務(wù):
(1)把運(yùn)行控制從函數(shù)體返回到函數(shù)調(diào)用點(diǎn)。在program5-1中就是在計(jì)算cuberoot(-q/2+a)之后再返回到語句xr=cuberoot()+cuberoot()計(jì)算過程中。(2)依據(jù)返回值要求,返回所需要數(shù)據(jù)值。
18第18頁
5.2.3函數(shù)返回函數(shù)返回值有下面幾個(gè)情形:1.返回void類型假如函數(shù)無值返回,應(yīng)說明為void類型。未作類型說明函數(shù),系統(tǒng)認(rèn)為是int類型函數(shù),應(yīng)返回一整型值。2.返回?cái)?shù)值類型最常見函數(shù)是返回一個(gè)數(shù)值函數(shù)。比如:intadd(inta,intb);當(dāng)函數(shù)要返回?cái)?shù)值不止一個(gè)時(shí),情況比較復(fù)雜,普通它能夠以結(jié)構(gòu)或類形式,也能夠以結(jié)構(gòu),數(shù)組或?qū)ο笾羔橆愋头绞綄?shí)現(xiàn),這么實(shí)例在后面章節(jié)能夠見到。
3.返回引用類型值返回方式是C和Pascal語言中唯一返回方式,C++語言提供引用返回概念是一個(gè)很強(qiáng)功效,當(dāng)函數(shù)定義中把該函數(shù)說明為某類型引用類型時(shí),該函數(shù)調(diào)用后返回不單是值,而是包含返回值變量(或?qū)ο螅?。因?yàn)榉祷匾门c引用類型相關(guān),所以這么實(shí)例將在下節(jié)介紹。
19第19頁函數(shù)應(yīng)用實(shí)例
1.實(shí)例1--無須給出函數(shù)f原型
設(shè)f(x)=(x*x+x+1)/2-5.5。(1)求z=(f(2.5)+2*f(6))/f(4.3),并顯示結(jié)果z。(2)對(duì)任意輸入一個(gè)實(shí)數(shù)a,求出f(a)并顯示。
程序執(zhí)行后交互結(jié)果以下:z=4.90618Inputa=10f(a)=5020第20頁程序編制:#include<iostream.h>doublef(doublex){ doubley; y=(x*x+x+1)/2-5.5; return(y); //對(duì)非void類型函數(shù),必須有一個(gè)//return語句,由它返回函數(shù)值}21第21頁
voidmain(){ doublez,a; z=(f(2.5)+2*f(6))/f(4.3);//調(diào)用自定義函數(shù)f cout<<"z="<<z<<endl; cout<<"Inputa="; //提醒用戶輸入
cin>>a; cout<<"f(a)="<<f(a)<<endl;//算出f(a)并輸出} 22第22頁點(diǎn)評(píng):
1)main中共出現(xiàn)了4次對(duì)自定義函數(shù)f調(diào)用。
2)編寫f函數(shù)時(shí)3點(diǎn)注意:(1)f函數(shù)體內(nèi)3行也可用以下一行來代替
return((x*x+x+1)/2-5.5); return句括號(hào)內(nèi)表示式值,即為整個(gè)函數(shù)返回值。
(2)return句也可使用另一格式,即能夠不括起表示式:
return(x*x+x+1)/2-5.5;//OK!23第23頁
(3)三種不正確使用方法
①
f=(x*x+x+1)/2-5.5;
不可給函數(shù)名f賦值。
②
return(f);
返回值類型應(yīng)該是double,而非指針類型(函數(shù)名相當(dāng)于一個(gè)指針)。
③
f(x)=(x*x+x+1)/2-5.5;
賦值號(hào)左端非變量(也即f(x)非左值)。
24第24頁
3)關(guān)于return語句
return語句(稱為返回語句)含有以下三種使用格式:
return; return<表示式>;
return(<表示式>);
第一個(gè)格式return用于馬上從被調(diào)函數(shù)中返回,當(dāng)函數(shù)類型為void時(shí),應(yīng)使用這種格式返回語句。 當(dāng)函數(shù)類型為非void型時(shí),應(yīng)使用第二或第三種格式return語句,此兩種格式語句效果完全相同(可將第二種格式看成是第三種格式省略形式),系統(tǒng)此時(shí)都將計(jì)算出表示式值,并“攜帶”該值馬上從被調(diào)函數(shù)中返回。25第25頁2.實(shí)例2--main在前而被調(diào)函數(shù)f
在后時(shí),必須先列出函數(shù)f原型
設(shè)f(x)=(x*x+x+1)/2-5.5。(1)求z=(f(2.5)+2*f(6))/f(4.3),并顯示結(jié)果z。(2)對(duì)任意輸入一個(gè)實(shí)數(shù)a,求出f(a)并顯示。
程序執(zhí)行后交互結(jié)果以下:z=4.90618Inputa=10f(a)=5026第26頁
程序編制:#include<iostream.h>doublef(doublex); //函數(shù)f原型
voidmain(){… //同上,從略}
doublef(doublex){ //被調(diào)函數(shù)f詳細(xì)定義… //同上,從略}27第27頁3.實(shí)例3--無參函數(shù),實(shí)現(xiàn)固定功效 編無參函數(shù),voidprintStar(),它負(fù)責(zé)完成固定功效:在同一行連續(xù)顯示60個(gè)“*”。并編制主函數(shù)main,對(duì)該函數(shù)實(shí)現(xiàn)調(diào)用,使程序執(zhí)行后顯示結(jié)果以下:theresultoffirstcallto'printStar()':************************************************************theresultofsecondcallto'printStar()':************************************************************28第28頁程序編制:
#include<iostream.h>voidprintStar(){ //自定義無參函數(shù)printStar for(inti=1;i<=60;i++)//顯示60個(gè)“*”
cout<<"*"; cout<<endl; return;}29第29頁
voidmain(){ cout<<"theresultoffirstcallto'printStar()':"<<endl; printStar(); //對(duì)printStar第一次調(diào)用
cout<<"theresultofsecondcallto'printStar()':"<<endl; printStar(); //對(duì)printStar第二次調(diào)用}
30第30頁點(diǎn)評(píng):
(1)將printStar定為void類型,是因?yàn)椴恍枰祷厝魏沃怠?/p>
(2)按語句方式調(diào)用printStar(而不可作為表示式因子,如3+printStar()/2等)。
(3)printStar函數(shù)中return用于馬上從被調(diào)函數(shù)中返回到主調(diào)函數(shù)處(跳轉(zhuǎn)到調(diào)用語句下一語句處)去執(zhí)行,當(dāng)函數(shù)類型為void時(shí),應(yīng)使用這種無返回值return語句。實(shí)際上,因?yàn)楸竞瘮?shù)是在執(zhí)行完函數(shù)體內(nèi)全部語句后才返回,此種情況下return語句能夠缺省。31第31頁
4.實(shí)例4--一參函數(shù)
編一參函數(shù),voidprintStar(intk),它負(fù)責(zé)顯示出k行“*”來,其中每行均顯示連續(xù)8個(gè)“*”。并編制主函數(shù)main,對(duì)該函數(shù)實(shí)現(xiàn)調(diào)用,使程序執(zhí)行后顯示結(jié)果樣式以下:k=?3************************32第32頁
程序編制:
#include<iostream.h>voidprintStar(intk){//k為形參,由調(diào)用處實(shí)參提供實(shí)際值
for(inti=1;i<=k;i++) //顯示出k行
cout<<"********"<<endl; return; //該return語句能夠缺省}
voidmain(){ intk; //欲顯示行數(shù)k cout<<"k=?"; //提醒用戶輸入
cin>>k; printStar(k); //函數(shù)調(diào)用,帶去輸入實(shí)參k
}33第33頁
5.實(shí)例5--二參函數(shù)
編二參函數(shù),voidprintStar(intk,intn),它負(fù)責(zé)顯示出k行“*”來,且每行均顯示連續(xù)n個(gè)“*”。并編制主函數(shù),對(duì)該函數(shù)實(shí)現(xiàn)調(diào)用,使程序執(zhí)行后顯示結(jié)果樣式以下:k,n=?415************************************************************34第34頁
程序編制:#include<iostream.h>voidprintStar(intk,intn){//負(fù)責(zé)顯示出k行'*'來,且每行均顯示連續(xù)n個(gè)'*'
for(inti=1;i<=k;i++){ //循環(huán)k次,顯示出k行“*”
for(intj=1;j<=n;j++)//循環(huán)n次,顯示出1行n個(gè)“*”
cout<<"*"; cout<<endl; }} //注意,函數(shù)末右花括號(hào)前缺省了一個(gè)return語句35第35頁
voidmain(){ intk,n;//顯示出k行,每行顯示n個(gè)“*”
cout<<"k,n=?"; cin>>k>>n; printStar(k,n); //以輸入k與n為實(shí)參去調(diào)用printStar} 36第36頁
6.實(shí)例6--無參函數(shù),全局變量
編無參函數(shù),voidprintStar(),并結(jié)合使用全局變量k與n,使每調(diào)用一次該函數(shù),總顯示出k行“*”來,且每行均顯示連續(xù)n個(gè)“*”,并編制主函數(shù),對(duì)該函數(shù)實(shí)現(xiàn)調(diào)用,使程序執(zhí)行后顯示結(jié)果樣式以下:k,n=?320************************************************************37第37頁程序編制:
#include<iostream.h>intk,n; //int型全局變量k,n/*
在全部函數(shù)之外(即在不屬于任一函數(shù)定義外面)說明變量為全局變量,其作用域即有效區(qū)域?yàn)檎麄€(gè)文件(或含有多個(gè)文件整個(gè)程序,詳細(xì)請參看本章5.7及5.8節(jié))。*/38第38頁
voidprintStar(){//無參函數(shù)printStar //其中所用k與n都是全局變量
for(inti=1;i<=k;i++){ //顯示出k行“*”
for(intj=1;j<=n;j++) //顯示n個(gè)“*”
cout<<"*"; cout<<endl; }}39第39頁voidmain(){ cout<<"k,n=?"; cin>>k>>n; //輸入全局變量k,全局變量n值
cout<<"theresultofcallto'printStar()':"<<endl; printStar(); //調(diào)用無參函數(shù)printStar} 40第40頁
5.2.4函數(shù)參數(shù)
C++語言允許函數(shù)無參,有一個(gè)或多個(gè)參數(shù),而且還支持不定個(gè)數(shù)參數(shù)函數(shù)。無參函數(shù):用void或空表示無參。一個(gè)或多個(gè)參數(shù):多數(shù)函數(shù)有一個(gè)或多個(gè)確定個(gè)數(shù)、確定類型和次序參數(shù)。在C++語言中,不一樣函數(shù)是依據(jù)函數(shù)名和參數(shù)表二者來區(qū)分,只有二者完全一致才是同一函數(shù)。(3)不定個(gè)數(shù)參數(shù):有些應(yīng)用問題中參數(shù)個(gè)數(shù)是改變。比如設(shè)計(jì)一個(gè)電話計(jì)費(fèi)函數(shù),為了計(jì)算通話費(fèi),不一樣通話類型(如市話,長途,數(shù)據(jù)與通訊,BP機(jī)等)有不一樣數(shù)目標(biāo)參數(shù)。處理參數(shù)個(gè)數(shù)不定情形,可有不一樣路徑:比如指針,C++提供一些庫函數(shù),無名參數(shù),可缺省參數(shù)等。
41第41頁
無名參數(shù)
--
C++語言,允許參數(shù)表中包含無名參數(shù),主要是為了區(qū)分函數(shù),比如:intf(inta,intb){returna+b*b;}intf(inta,intb,int){returna*a+b;}兩個(gè)不一樣函數(shù)同名,但因?yàn)榈诙€(gè)函數(shù)包含一無名參數(shù),使得在調(diào)用時(shí)能夠被區(qū)分,f(x,y)是第一個(gè)函數(shù)調(diào)用,f(x,y,0)是第二個(gè)函數(shù)調(diào)用。42第42頁
可缺省參數(shù)(參數(shù)默認(rèn)值)
--
允許在函數(shù)定義處為其中最終面連續(xù)若干個(gè)參數(shù)設(shè)置默認(rèn)值(也稱缺省值),從而為調(diào)用處提供了方便(若調(diào)用處缺省了某個(gè)或一些實(shí)參情況下,系統(tǒng)將自動(dòng)使用那些在函數(shù)定義處給定參數(shù)默認(rèn)值)。
下面是一個(gè)示例性程序,在定義函數(shù)func時(shí)為它最終面連續(xù)3個(gè)參數(shù)(也即它全部參數(shù))都設(shè)置了默認(rèn)值。若調(diào)用處缺省了某個(gè)或一些實(shí)參情況下,系統(tǒng)將自動(dòng)使用這些給定參數(shù)默認(rèn)值。43第43頁#include<iostream.h>voidfunc(inta=11,intb=22,intc=33){ //為參數(shù)a、b、c設(shè)置了默認(rèn)值11、22與33 cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;}
44第44頁voidmain(){
func();
//調(diào)用時(shí)缺省了3個(gè)實(shí)參,將使用 //定義處給定那3個(gè)相對(duì)應(yīng)參數(shù)默認(rèn)值
func(55); //調(diào)用時(shí)缺省了后2個(gè)實(shí)參,將使用 //定義處給定那后2個(gè)對(duì)應(yīng)參數(shù)默認(rèn)值
func(77,99); //調(diào)用時(shí)缺省了最終1個(gè)實(shí)參,將使用 //定義處給定那最終1個(gè)參數(shù)默認(rèn)值
func(8,88,888); //調(diào)用時(shí)沒缺省任一個(gè)實(shí)參,系統(tǒng)將 //不使用定義處給定任一個(gè)參數(shù)默認(rèn)值}45第45頁程序執(zhí)行后顯示結(jié)果以下:
a=11,b=22,c=33a=55,b=22,c=33a=77,b=99,c=33a=8,b=88,c=88846第46頁
注意,只能為函數(shù)最終面連續(xù)若干個(gè)
參數(shù)設(shè)置默認(rèn)值,且在調(diào)用處也只能缺省
后面連續(xù)若干個(gè)實(shí)參。
voidfunc(inta,intb=2,intc=3); //OK!voidfunc(inta=1,intb,intc=3); //ERROR!
對(duì)第一個(gè)函數(shù)說明,采取以下調(diào)用語句:
func(1,22,333); //OK!調(diào)用時(shí)給出全部實(shí)參
func(); //ERROR!參數(shù)a沒有默認(rèn)值
func(10,20); //OK!參數(shù)c默認(rèn)為3
func(5,,9); //ERROR!調(diào)用處也只能缺省后面連續(xù)若干個(gè)實(shí)參47第47頁
5.2.5值調(diào)用和引用調(diào)用
C++語言在進(jìn)行函數(shù)調(diào)用時(shí),對(duì)參數(shù)處理有兩種方式,賦值型和引用型,即值調(diào)用方式和引用調(diào)用方式。前者是普通形式,在C語言中只有這種方式;C++語言中增加了引用調(diào)用形式,這種形式與pascal語言中變量參數(shù)調(diào)用方式相同。
1賦值調(diào)用2引用調(diào)用
48第48頁賦值調(diào)用
--賦值形參:在函數(shù)定義參數(shù)中,除了被說明為引用(&)參數(shù)之外,其余全部類型形參都屬于賦值形參。過程:在執(zhí)行函數(shù)調(diào)用時(shí),在檢驗(yàn)函數(shù)名及參數(shù)表之后,首先為值參數(shù)分配內(nèi)存,然后計(jì)算各對(duì)應(yīng)實(shí)參表示式,并把計(jì)算值賦給剛才創(chuàng)建參數(shù)變量,進(jìn)而開始函數(shù)體運(yùn)行。凡是賦值形參,在函數(shù)每次調(diào)用時(shí),都必須為每一個(gè)賦值形參創(chuàng)建一個(gè)新參數(shù)變量。實(shí)參表示式:另首先,函數(shù)調(diào)用語句中,與賦值形參相對(duì)應(yīng)實(shí)參能夠是指定類型常量、變量或表示式。在執(zhí)行函數(shù)調(diào)用時(shí)應(yīng)把該表示式值計(jì)算出來,作為初值賦給剛才為賦值形參創(chuàng)建參數(shù)變量。這是賦值調(diào)用方式名稱由來。為賦值形參創(chuàng)建參數(shù)變量是局限于函數(shù)體運(yùn)行局部變量,它作為該形參一個(gè)實(shí)例,參加函數(shù)體程序塊這次運(yùn)行,一旦運(yùn)行完成,這個(gè)參數(shù)變量就被撤消。49第49頁引用調(diào)用函數(shù)定義參數(shù)表中,名字前加上符號(hào)&參數(shù)為引用形參。比如voidswap(int&a,int&b);引用形參在調(diào)用過程中參數(shù)傳遞機(jī)制不一樣于賦值形參。其關(guān)鍵點(diǎn)是:(1)函數(shù)調(diào)用語句中對(duì)應(yīng)于引用形參實(shí)參必須是同一類型變量,非變量表示式則不允許。(2)參數(shù)傳遞內(nèi)容不是實(shí)參值,而是地址,其實(shí)際效果是令對(duì)應(yīng)引用形參在調(diào)用過程中,作為一個(gè)變量名指向作為實(shí)參這個(gè)變量,與賦值形參不一樣在這里表示出來,在引用調(diào)用過程中并不創(chuàng)建新參數(shù)變量!(3)在函數(shù)體程序塊運(yùn)行中,引用形參每次出現(xiàn),因?yàn)樗F(xiàn)在已經(jīng)是指向?qū)崊⒆兞?,所以相?dāng)于全用實(shí)參變量所代替。即起到了所謂“換名”作用。(4)在函數(shù)體程序運(yùn)行結(jié)束,控制轉(zhuǎn)回調(diào)用點(diǎn)時(shí),該引用形參加實(shí)參變量對(duì)應(yīng)關(guān)系也就終止了。不過在調(diào)用過程中對(duì)于這個(gè)實(shí)參變量全部處理和操作結(jié)果,卻保留下來。這一點(diǎn)也是區(qū)分于賦值調(diào)用。50第50頁引用調(diào)用設(shè)計(jì)函數(shù)在下面兩種情形時(shí),①需要改變一些變量值(上述函數(shù)swap就是一例);②對(duì)于占內(nèi)存較多數(shù)據(jù)參數(shù),為了不另建新參數(shù)變量以節(jié)約內(nèi)存,提議采取引用參數(shù)。在后一個(gè)情況,為了確保實(shí)參不在函數(shù)中被修改,可在形參說明中加上const說明,比如:complexadd(constcomplex&a,constcomplex&b);而對(duì)于賦值形參,則無此必要。51第51頁實(shí)例
voidprintStar(intk,intn); //它所用兩個(gè)參數(shù)均為賦值參數(shù)。
voidswap(int&x,int&y); //它所用兩個(gè)參數(shù)均為引用參數(shù)。
intmyFunc(inta,float&b); //它所用第一個(gè)參數(shù)為賦值參數(shù) //另一個(gè)為引用參數(shù)。
語法要求:調(diào)用函數(shù)時(shí),引用參數(shù)對(duì)應(yīng)實(shí)參必須是指定類型變量。52第52頁
對(duì)函數(shù)進(jìn)行調(diào)用執(zhí)行過程(步驟):
(1)將對(duì)應(yīng)實(shí)參表示式值賦給賦值形參(若參數(shù)為賦值參數(shù)話);
(2)用實(shí)參變量替換對(duì)應(yīng)形參(若參數(shù)為引用參數(shù)話);
(3)按各形參“當(dāng)前值”(或已被“賦值”,或已被“換名”)去執(zhí)行一遍函數(shù)體并返回調(diào)用處。53第53頁注意:
(1)經(jīng)過賦值參數(shù)來傳值方式是一個(gè)“單向傳值”方式,它只可向被調(diào)函數(shù)形參“傳入”值,而不可經(jīng)過該形參“傳出”值。
(2)經(jīng)過引用參數(shù)來傳值方式是一個(gè)“雙向傳值”方式,它不但可向被調(diào)函數(shù)形參“傳入”值,而且還可經(jīng)過該形參“傳出”值。54第54頁實(shí)例
經(jīng)過下面小例子來了解賦值參數(shù)與引用參數(shù)使用區(qū)分。
#include<iostream.h>voidf1(int&a,int&b,intc,intd);//函數(shù)原型//前兩個(gè)為引用參數(shù),可“雙向傳值”//后兩個(gè)為賦值參數(shù)55第55頁
voidmain(){ inti=1,j=2,k=77,n=88; cout<<"---Inmain,beforcallingf1---"<<endl;
cout<<"i,j,k,n="<<i<<""<<j<<""<<k<<""<<n<<endl<<endl; f1(i,j,k,n);
//注意,調(diào)用后實(shí)參變量i、j值進(jìn)行了改變 //而k與n值并不改變
cout<<"---Inmain,aftercallingf1---"<<endl;
cout<<"i,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能化農(nóng)業(yè)機(jī)械購置及售后服務(wù)合同范本4篇
- 二零二五年度「精英招募」企業(yè)人才招聘合同模板3篇
- 二零二五年度游戲角色設(shè)計(jì)授權(quán)合同4篇
- 2025年度房地產(chǎn)項(xiàng)目預(yù)售合同示范文本4篇
- 2025年度南匯農(nóng)業(yè)志修訂與版權(quán)登記合同3篇
- 二零二五版汽車維修連鎖店經(jīng)營權(quán)轉(zhuǎn)讓合同2篇
- 2025年度個(gè)人設(shè)備租賃擔(dān)保貸款合同范本2篇
- 2025年度苗木出口貿(mào)易合同標(biāo)準(zhǔn)樣本3篇
- 2025年度個(gè)人借款合同信用評(píng)估體系構(gòu)建4篇
- 二零二五年度新型建材門面房租賃及推廣合作合同
- 河北省邯鄲市永年區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末考試化學(xué)試卷(含答案)
- 交通運(yùn)輸行政執(zhí)法程序規(guī)定培訓(xùn)課件
- 2024屆高考英語詞匯3500左右
- 邏輯思維訓(xùn)練500題
- 第八講 發(fā)展全過程人民民主PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 實(shí)體瘤療效評(píng)價(jià)標(biāo)準(zhǔn)RECIST-1.1版中文
- 企業(yè)新春茶話會(huì)PPT模板
- GB/T 19185-2008交流線路帶電作業(yè)安全距離計(jì)算方法
- DIC診治新進(jìn)展課件
- 公路工程施工現(xiàn)場安全檢查手冊
- 1汽輪機(jī)跳閘事故演練
評(píng)論
0/150
提交評(píng)論