




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章函數(shù)C++程序設(shè)計(jì)第1頁本小節(jié)內(nèi)容3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制3.3遞歸函數(shù)3.4默認(rèn)參數(shù)函數(shù)3.5函數(shù)重載3.6函數(shù)模板C++程序設(shè)計(jì)第2頁3.1函數(shù)定義在編輯一個(gè)大型程序時(shí),即使各個(gè)函數(shù)前后次序不一樣,程序執(zhí)行開始點(diǎn)永遠(yuǎn)是主函數(shù)。主函數(shù)按照調(diào)用與被調(diào)用關(guān)系調(diào)用子函數(shù)。子函數(shù)假如與其它子函數(shù)又存在調(diào)用與被調(diào)用關(guān)系,當(dāng)然還能夠再調(diào)用其它子函數(shù)。
C++程序設(shè)計(jì)第3頁3.1函數(shù)定義函數(shù)是面向?qū)ο蟪绦蛟O(shè)計(jì)中基本抽象單元,是對(duì)功效抽象。C++程序設(shè)計(jì)第4頁3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制3.3遞歸函數(shù)3.4默認(rèn)參數(shù)函數(shù)3.5函數(shù)重載3.6函數(shù)模板3.7變量作用域C++程序設(shè)計(jì)第5頁3.1函數(shù)定義主函數(shù)main()調(diào)用函數(shù)
func1調(diào)用函數(shù)
func2函數(shù)func2()函數(shù)func1()函數(shù)func2()C++程序設(shè)計(jì)第6頁
在一對(duì)調(diào)用與被調(diào)用關(guān)系中,我們把調(diào)用其它函數(shù)函數(shù)稱為主調(diào)函數(shù),被其它函數(shù)調(diào)用函數(shù)稱為被調(diào)函數(shù)。在一個(gè)較為復(fù)雜大型程序中,一個(gè)函數(shù)很可能同時(shí)飾演兩種不一樣角色——主調(diào)函數(shù)與被調(diào)函數(shù),即既調(diào)用別函數(shù)(被調(diào)函數(shù))又被另外函數(shù)(主調(diào)函數(shù))調(diào)用。函數(shù)普通應(yīng)恪守先定義后調(diào)用標(biāo)準(zhǔn),不然應(yīng)在調(diào)用函數(shù)中先進(jìn)行原形說明。C++程序設(shè)計(jì)第7頁一、函數(shù)定義一個(gè)完整函數(shù)定義由兩部分組成,即函數(shù)頭與函數(shù)體。1.函數(shù)定義普通語法形式<類型標(biāo)識(shí)符><函數(shù)名說明符>(形式參數(shù)表){
說明性語句序列;實(shí)現(xiàn)函數(shù)功效語句系列;
}函數(shù)頭函數(shù)體C++程序設(shè)計(jì)第8頁函數(shù)頭是指上述格式中<類型標(biāo)識(shí)符><函數(shù)名說明符>(形式參數(shù)表)。其中函數(shù)名可由函數(shù)設(shè)計(jì)者命名,能夠是任何一個(gè)不重復(fù)正當(dāng)標(biāo)識(shí)符(唯一例外是,主函數(shù)必須命名為main)。函數(shù)體是指上述格式中被一對(duì)大括號(hào)括起復(fù)合語句部分。該函數(shù)所應(yīng)實(shí)現(xiàn)功效由對(duì)應(yīng)復(fù)合語句完成。C++程序設(shè)計(jì)第9頁2、形式參數(shù)表<type1>name1,<type2>name2,...,
<typen>namen3、函數(shù)返回值由return語句給出,比如:
return0無返回值函數(shù)(void類型),無須寫return語句。C++程序設(shè)計(jì)第10頁
函數(shù)在沒有被調(diào)用時(shí)候其形參只是一個(gè)符號(hào),它標(biāo)志著在形參出現(xiàn)位置應(yīng)該有一個(gè)什么類型數(shù)據(jù)。函數(shù)在被調(diào)用時(shí)才由主調(diào)函數(shù)將實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)賦予形參。從這一點(diǎn)上說,C++中函數(shù)與數(shù)學(xué)中函數(shù)概念極其相同。比如,我們都熟悉以下數(shù)學(xué)中函數(shù)形式:
f(x)=3x+5x-2
這個(gè)函數(shù)只有當(dāng)自變量x被賦以確定值以后,才能計(jì)算出函數(shù)值。C++程序設(shè)計(jì)第11頁二、函數(shù)調(diào)用假如沒有恪守先定義后調(diào)用標(biāo)準(zhǔn),調(diào)用函數(shù)之前先要在主調(diào)函數(shù)中申明函數(shù)原型。在主調(diào)函數(shù)中,或全部函數(shù)之前,按以下形式進(jìn)行函數(shù)原型申明:
<類型標(biāo)識(shí)符><被調(diào)函數(shù)名>(含類型說明形參表);函數(shù)原型申明C++程序設(shè)計(jì)第12頁
假如是在全部函數(shù)之前申明了函數(shù)原型,那么該函數(shù)原型在本程序文件中任何地方都有效,也就是說,在本程序文件中任何地方都能夠依照該原型調(diào)用對(duì)應(yīng)函數(shù)。假如是在某個(gè)主調(diào)函數(shù)內(nèi)部申明了被調(diào)函數(shù)原型,那么該原型就只能在這個(gè)函數(shù)內(nèi)部有效。申明了函數(shù)原型之后,便能夠按以下形式調(diào)用子函數(shù):
<函數(shù)名>(實(shí)參1,實(shí)參2,…,實(shí)參n)調(diào)用函數(shù)C++程序設(shè)計(jì)第13頁實(shí)參列表中應(yīng)給出與函數(shù)原型中形參個(gè)數(shù)相同、類型相符實(shí)參,每個(gè)實(shí)參都能夠是常量、變量或表示式三者之一。實(shí)參加實(shí)參之間用逗號(hào)作為分隔符。注意,這里逗號(hào)不是次序求值運(yùn)算符。函數(shù)調(diào)用能夠作為一條語句,這時(shí)函數(shù)能夠沒有返回值。函數(shù)調(diào)用也能夠出現(xiàn)在表示式中,這時(shí)就必須有一個(gè)明確返回值。函數(shù)調(diào)用示比如下。C++程序設(shè)計(jì)第14頁【例1】編寫一個(gè)n!函數(shù),并調(diào)用。(1)n!函數(shù)longfac(intn){ inti,jc=1; if(n<0) { cout<<"n不能小于0"<<endl; return-1; } for(i=1;i<=n;i++) jc*=i; returnjc;}C++程序設(shè)計(jì)第15頁(2)函數(shù)調(diào)用#include<iostream.h>longfac(intn);//原型說明語句voidmain(){ inta; cout<<"請(qǐng)輸入a值:"<<endl; cin>>a; cout<<"a!="<<fac(a)<<endl;}C++程序設(shè)計(jì)第16頁【例2】求任意兩個(gè)數(shù)最大值函數(shù)及其調(diào)用。#include<iostream.h>intmax(intx,inty);voidmain(){
inta,b,c; cout<<"請(qǐng)輸入a、b、c值:"<<endl; cin>>a>>b>>c; cout<<“a、b、c最大值是"<<max(max(a,b),c)<<endl;}intmax(intx,inty){ if(x<y)returny; elsereturnx;}C++程序設(shè)計(jì)第17頁【例3】編寫一個(gè)函數(shù),把華氏溫度轉(zhuǎn)換為攝氏溫度,公式為C=(F-32)*5/9,公式中F代表華氏溫度,C代表攝氏溫度。在主函數(shù)中提醒用戶輸入一個(gè)華氏溫度,并完成輸入及輸出,由函數(shù)完成轉(zhuǎn)化功效。程序代碼以下:
#include<iostream.h>floathstoss(floatfHuashi);//原型說明
voidmain(){C++程序設(shè)計(jì)第18頁floatfHuashi; cout<<endl<<"輸入一個(gè)華氏溫度值:"; cin>>fHuashi; cout<<"華氏"<<fHuashi <<"度對(duì)應(yīng)攝氏溫度"<<hstoss(fHuashi)<<"度"<<endl; //函數(shù)調(diào)用作為一個(gè)表示式出現(xiàn)在輸出語句中}floathstoss(floatfHuashi){ floatfSheshi; fSheshi=(fHuashi-32)*5/9; C++程序設(shè)計(jì)第19頁return(fSheshi);}程序運(yùn)行結(jié)果為輸入一個(gè)華氏溫度值:68華氏68度對(duì)應(yīng)攝氏20度C++程序設(shè)計(jì)第20頁
函數(shù)參數(shù)用于在調(diào)用函數(shù)與被調(diào)用函數(shù)之間進(jìn)行數(shù)據(jù)傳遞。在函數(shù)定義時(shí),函數(shù)名后面括號(hào)內(nèi)參數(shù)稱為形式參數(shù)(簡(jiǎn)稱形參)。在函數(shù)被調(diào)用時(shí),函數(shù)名后面括號(hào)內(nèi)參數(shù)稱為實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)。三、函數(shù)參數(shù)傳遞C++程序設(shè)計(jì)第21頁
當(dāng)函數(shù)未被調(diào)用時(shí),C++編譯系統(tǒng)并沒有給函數(shù)形參分配對(duì)應(yīng)內(nèi)存空間,函數(shù)形參更不會(huì)有實(shí)際值。只有在函數(shù)被調(diào)用時(shí),C++編譯系統(tǒng)這時(shí)才為形參分配實(shí)際存放單元,并將實(shí)參加形參結(jié)合。實(shí)參能夠是常量、變量或表示式,其類型必須與形參相符。函數(shù)參數(shù)傳遞,指就是形參加實(shí)參結(jié)合(簡(jiǎn)稱形實(shí)結(jié)合)過程。形實(shí)結(jié)合方式有值調(diào)用和引用調(diào)用兩種。三、函數(shù)參數(shù)傳遞C++程序設(shè)計(jì)第22頁值調(diào)用是指當(dāng)發(fā)生函數(shù)調(diào)用時(shí),編譯系統(tǒng)為形參分配對(duì)應(yīng)存放空間而且直接將實(shí)參值復(fù)制給形參,這么形參和實(shí)參就各自擁有不一樣存放單元,且形參是實(shí)參副本。所以,值調(diào)用過程是參數(shù)值單向傳遞過程,一旦形參取得了與實(shí)參相同值就與實(shí)參脫離關(guān)系,以后不論形參發(fā)生多大改變,都決不會(huì)反過來影響到實(shí)參。1.值調(diào)用C++程序設(shè)計(jì)第23頁【例4】從鍵盤輸入兩個(gè)整數(shù),交換位置后輸出(交換未成功)。#include<iostream.h>voidswap(inta,intb);voidmain(){ intx,y; x=5; y=10; 1.值調(diào)用C++程序設(shè)計(jì)第24頁cout<<"x="<<x<<"y="<<y<<endl; swap(x,y);//交換x,y值cout<<"afterswap"<<endl; cout<<"x="<<x<<"y="<<y<<endl;}voidswap(inta,intb){ intt; t=a; a=b; b=t;}1.值調(diào)用C++程序設(shè)計(jì)第25頁程序運(yùn)行結(jié)果為
x=5y=10afterswapx=5y=10
分析:從上面程序運(yùn)行結(jié)果能夠看出,并沒有到達(dá)交換目標(biāo)。這是因?yàn)椴扇鬟f方式不合乎問題要求。在單向值傳遞方式中,形參值雖確實(shí)進(jìn)行了交換,但這些改變對(duì)實(shí)參不起任何作用。1.值調(diào)用C++程序設(shè)計(jì)第26頁執(zhí)行主調(diào)函數(shù)中函數(shù)調(diào)用語句swap(x、y)后,編譯系統(tǒng)將實(shí)參x中值5傳遞給虛參a,將實(shí)參y中值10傳遞給虛參b;在swap函數(shù)中,a、b中值完成交換;返回主函數(shù)時(shí),實(shí)參x、y中值不受虛參a、b影響,并未進(jìn)行交換。1.值調(diào)用C++程序設(shè)計(jì)第27頁顯而易見,值調(diào)用時(shí)參數(shù)傳遞方式是實(shí)參單向復(fù)制其值給虛參,假如我們想使子函數(shù)中對(duì)形參所做任何更改也能及時(shí)反應(yīng)給主函數(shù)中實(shí)參(即希望形參加實(shí)參影響是相互或稱是雙向),又該怎么辦呢?這就需要改變調(diào)用方式,即采取第二種參數(shù)傳遞方式——引用調(diào)用。
引用是一個(gè)特殊類型變量,能夠被認(rèn)為是某一個(gè)變量別名。經(jīng)過引用名與經(jīng)過被引用變量名訪問變量效果是一樣。這就是說,對(duì)形參任何操作也就直接作用于實(shí)參。2.引用調(diào)用C++程序設(shè)計(jì)第28頁比如:
inta,b;int&ra=a; //建立一個(gè)int型引用ra,并將其初始化為變量a一個(gè)別名
b=10;ra=b; //相當(dāng)于a=b;
注意:①申明一個(gè)引用時(shí),必須同時(shí)對(duì)它進(jìn)行初始化,使它與一個(gè)已存在對(duì)象關(guān)聯(lián)。2.引用調(diào)用C++程序設(shè)計(jì)第29頁②一旦一個(gè)引用被初始化后,就不能改變關(guān)聯(lián)對(duì)象。換言之,一個(gè)引用從它被申明之后,就必須確定是哪個(gè)變量別名,而且自始至終只能作為這一個(gè)變量別名,不能另作他用。形參也能夠引用方式出現(xiàn)在形參表中。引用作為形參情況與變量引用稍有不一樣。這是因?yàn)椋螀⒊跏蓟辉陬愋驼f明時(shí)進(jìn)行,而是在執(zhí)行主調(diào)函數(shù)中調(diào)用語句時(shí),才為形參分配內(nèi)存空間,同時(shí)用實(shí)參來初始化形參。2.引用調(diào)用C++程序設(shè)計(jì)第30頁【例5】使用引用調(diào)用改寫例7-5程序,使兩實(shí)參中數(shù)真正進(jìn)行交換。#include<iostream.h>voidswap(int&a,int&b);voidmain(){ intx,y; x=5; y=10; cout<<"x="<<x<<"y="<<y<<endl;2.引用調(diào)用C++程序設(shè)計(jì)第31頁
swap(x,y);//交換x,y值
cout<<"afterswap"<<endl; cout<<"x="<<x<<"y="<<y<<endl;}voidswap(int&a,int&b){ intt; t=a; a=b; b=t;}2.引用調(diào)用C++程序設(shè)計(jì)第32頁程序運(yùn)行結(jié)果為x=5y=10afterswapx=10y=5
分析:子函數(shù)swap兩個(gè)參數(shù)都是引用,當(dāng)被調(diào)用時(shí),它們分別被初始化成為a和b別名。所以,在子函數(shù)swap中將兩個(gè)參數(shù)值進(jìn)行交換后,交換結(jié)果能夠返回主函數(shù)main。2.引用調(diào)用C++程序設(shè)計(jì)第33頁3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制
3.3遞歸函數(shù)3.4默認(rèn)參數(shù)函數(shù)3.5函數(shù)重載3.6函數(shù)模板3.7變量作用域C++程序設(shè)計(jì)第34頁3.2函數(shù)調(diào)用機(jī)制
一個(gè)C++源程序經(jīng)過編譯以后形成與源程序主名相同但后綴為.exe可執(zhí)行文件,且存放在外存放器中。當(dāng)該.exe可執(zhí)行程序被運(yùn)行時(shí),首先從外存將程序代碼裝載到內(nèi)存代碼區(qū),然后從main函數(shù)起始處開始執(zhí)行。程序在執(zhí)行過程中,假如碰到了對(duì)其它函數(shù)調(diào)用,則暫停當(dāng)前函數(shù)執(zhí)行,
C++程序設(shè)計(jì)第35頁
保留下一條指令地址(即返回地址,作為從子函數(shù)返回后繼續(xù)執(zhí)行入口點(diǎn)),并保留現(xiàn)場(chǎng)(主要是一些存放器內(nèi)容),然后轉(zhuǎn)到子函數(shù)入口地址,執(zhí)行子函數(shù)。當(dāng)碰到return語句或者子函數(shù)結(jié)束時(shí),則恢復(fù)先前保留現(xiàn)場(chǎng),并從先前保留返回地址開始繼續(xù)執(zhí)行。圖2說明了函數(shù)調(diào)用和返回過程,圖中標(biāo)號(hào)標(biāo)明了執(zhí)行次序。3.2函數(shù)調(diào)用機(jī)制C++程序設(shè)計(jì)第36頁圖2函數(shù)調(diào)用和返回示意圖
Main()func()調(diào)用func()結(jié)束返回保留:
返回地址當(dāng)前現(xiàn)場(chǎng)恢復(fù):
主調(diào)函數(shù)現(xiàn)場(chǎng)返回地址⑥①⑦②③④⑤3.2函數(shù)調(diào)用機(jī)制C++程序設(shè)計(jì)第37頁作業(yè)1:設(shè)N=10,X=2、4、6、8,即求N事件中每次取2、4、6、8組合數(shù)。分析:這個(gè)問題需要重復(fù)利用兩個(gè)公式:①N!②N!/X!/(N-X)!
設(shè)計(jì)兩個(gè)函數(shù):一個(gè)求整數(shù)階乘函數(shù)lJiecheng和一個(gè)求組合數(shù)函數(shù)lComb。由主函數(shù)main調(diào)用lComb,lComb又調(diào)用lJiecheng。C++程序設(shè)計(jì)第38頁程序代碼以下:#include<iostream.h>longlJiecheng(intn){ longrt=1; inti; for(i=1;i<=n;i++) rt=rt*i; returnrt;C++程序設(shè)計(jì)第39頁}longlComb(intN,intX){ returnlJiecheng(N)/lJiecheng(X)/lJiecheng(N-X);}voidmain(){ longlJiecheng(intn); longlComb(intN,intX);C++程序設(shè)計(jì)第40頁
intiNum,x; do {cout<<"請(qǐng)輸入事件數(shù)(大于等于8):"; cin>>iNum; }while(iNum<10); for(x=2;x<10;x+=2) cout<<"C("<<iNum<<","<<x<<")="<<lComb(iNum,x)<<endl;}程序運(yùn)行結(jié)果為請(qǐng)輸入事件數(shù)(大于等于8):11C(11,2)=55C(11,4)=330C(11,6)=462C(11,8)=165C++程序設(shè)計(jì)第41頁回顧3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制 參數(shù)傳遞:傳值傳地址C++程序設(shè)計(jì)第42頁3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制3.3遞歸函數(shù)
3.4默認(rèn)參數(shù)函數(shù)3.5函數(shù)重載3.6函數(shù)模板3.7變量作用域C++程序設(shè)計(jì)第43頁3.3遞歸函數(shù)
遞歸函數(shù)又稱為自調(diào)用函數(shù),其特點(diǎn)是,在函數(shù)內(nèi)部直接或間接地自己調(diào)用自己。所謂直接調(diào)用本身,就是指在一個(gè)函數(shù)函數(shù)體中出現(xiàn)了對(duì)本身調(diào)用語句。比如:
voidfunc1(void){...func1();//func1調(diào)用func1本身
...}3.3遞歸函數(shù)C++程序設(shè)計(jì)第44頁3.3遞歸函數(shù)函數(shù)直接或間接地調(diào)用本身,稱為遞歸調(diào)用。4!=4*3!3!=3*2!2!=2*1!1!=1*0!0!=10!=11!=1*0!=12!=2*1!=23!=3*2!=64!=4*3!=24Subtitle未知Subtitle已知未知已知遞推:回歸:遞歸過程兩個(gè)階段:C++程序設(shè)計(jì)第45頁【例6】求n!分析:計(jì)算n!公式以下:n!=n(n-1)!(n>0)1(n=0)這是一個(gè)遞歸形式公式,應(yīng)該用遞歸函數(shù)實(shí)現(xiàn).3.3遞歸函數(shù)C++程序設(shè)計(jì)第46頁源程序:#include<iostream.h>Longfac(intn){longf;if(n<0)cour<<“n<0,dataerror!”<<endl;
elseif(n==0)f=1;elsef=fac(n-1)*n;returnf;}3.3遞歸函數(shù)C++程序設(shè)計(jì)第47頁voidmain(){longfac(intn);intn;longy;cout<<"Enterapositiveinteger:";cin>>n;y=fac(n);cout<<n<<"!="<<y<<endl;}運(yùn)行結(jié)果:Enterapositiveinteger:88!=403203.3遞歸函數(shù)C++程序設(shè)計(jì)第48頁循環(huán)終止條件一個(gè)遞歸調(diào)用語句(遞推關(guān)系)遞歸條件3.3遞歸函數(shù)C++程序設(shè)計(jì)第49頁作業(yè)2:有5個(gè)人坐在一起,問第1個(gè)人多少歲,他說比第2個(gè)人大2歲。問第2個(gè)人多少歲,他說比第3個(gè)人大2歲。問第3個(gè)人多少歲,他說比第4個(gè)人大2歲。問第4個(gè)人多少歲,他說比第5個(gè)人大2歲。最終問第5個(gè)人,他說是12歲。請(qǐng)問第1個(gè)人多少歲?分析:這是一個(gè)遞歸問題。每一個(gè)人年紀(jì)都比其后那個(gè)人年紀(jì)大2,即3.3遞歸函數(shù)C++程序設(shè)計(jì)第50頁age(1)=age(2)+2age(2)=age(3)+2age(3)=age(4)+2age(4)=age(5)+2age(5)=12能夠用公式表示以下:12(n=5)age(n)=age(n+1)+2(n<5)3.3遞歸函數(shù)C++程序設(shè)計(jì)第51頁程序代碼以下:#include<iostream.h>intage(intn){ intss; if(n==5)ss=12; elsess=age(n+1)+2; return(ss);}voidmain()3.3遞歸函數(shù)C++程序設(shè)計(jì)第52頁{ intage(intn); cout<<"第一個(gè)人年紀(jì)為"<<age(1)<<"歲"<<endl;}程序運(yùn)行結(jié)果為第一個(gè)人年紀(jì)為20歲3.3遞歸函數(shù)C++程序設(shè)計(jì)第53頁3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制3.3遞歸函數(shù)3.4默認(rèn)參數(shù)函數(shù)
3.5函數(shù)重載3.6函數(shù)模板3.7變量作用域C++程序設(shè)計(jì)第54頁3.4默認(rèn)參數(shù)函數(shù)
在函數(shù)定義中經(jīng)過賦值運(yùn)算就可指定默認(rèn)參數(shù)值。一旦程序在調(diào)用該函數(shù)時(shí),假如給出實(shí)參,則用實(shí)參初始化形參;假如沒有給出實(shí)參,則C++編譯系統(tǒng)自動(dòng)以預(yù)先賦值默認(rèn)參數(shù)值作為傳入數(shù)值。普通情況下都將調(diào)用該函數(shù)時(shí)經(jīng)慣用到常數(shù)作為默認(rèn)參數(shù)值,這么在調(diào)用時(shí)就無需每次都寫出該值了。指定默認(rèn)參數(shù)值能夠使函數(shù)使用更為簡(jiǎn)單,同時(shí)也增強(qiáng)了函數(shù)可重用性。C++程序設(shè)計(jì)第55頁【例7】帶默認(rèn)形參值函數(shù)例題。#include<iostream.h>intmult(intn,int
k=2)//第二個(gè)形參含有默認(rèn)值{ if(k==2) return(n*n); else return(mult(n,k-1)*n);}voidmain()3.4默認(rèn)參數(shù)函數(shù)C++程序設(shè)計(jì)第56頁{ cout<<endl<<mult(5)<<endl; /*形參n用實(shí)參來初始化為5,形參k采取默認(rèn)值2,實(shí)現(xiàn)5*5*/ cout<<mult(5,3)<<endl; /*用實(shí)參來初始化形參,n為5,k為3,實(shí)現(xiàn)5*5*5*/}程序運(yùn)行結(jié)果為251253.4默認(rèn)參數(shù)函數(shù)C++程序設(shè)計(jì)第57頁默認(rèn)形參值必須按從右向左次序定義。在有默認(rèn)值形參右面,不能出現(xiàn)無默認(rèn)值形參。因?yàn)樵谡{(diào)用時(shí),實(shí)參初始化形參是按從左向右次序。比如:voidtry(intj=3,intk) voidtry(intj,intk=2,intm) voidtry(intj,intk=7) voidtry(intj,intk=2,intm=3) voidtry(intj=3,intk=2,intm=3)//非法//非法//正當(dāng)//正當(dāng)//正當(dāng)3.4默認(rèn)參數(shù)函數(shù)C++程序設(shè)計(jì)第58頁默認(rèn)形參值應(yīng)該在函數(shù)原型中給出。比如:intmulti(intx=2,inty=5); //默認(rèn)形參值在函數(shù)原型中給出voidmain(){multi(); //并非無參調(diào)用,而是采取默認(rèn)值,x取值2,y取值5}intmulti(intx,inty){return(x*y);}3.4默認(rèn)參數(shù)函數(shù)C++程序設(shè)計(jì)第59頁在相同作用域內(nèi),默認(rèn)形參值說明應(yīng)保持唯一。但假如在不一樣作用域內(nèi),允許說明不一樣默認(rèn)形參。這里作用域是指直接包含著函數(shù)原型說明大括號(hào)所界定范圍。比如:
intadd(intx=2,inty=5);//全局默認(rèn)形參值
voidmain(){intadd(intx=1,inty=9);//局部默認(rèn)形參值3.4默認(rèn)參數(shù)函數(shù)C++程序設(shè)計(jì)第60頁add();//此處調(diào)用時(shí),采取局部默認(rèn)形參值,x取值1,y取值9}voidfunc(void){add()//此處調(diào)用時(shí),采取全局默認(rèn)形參值,x取值2,y取值5}3.4默認(rèn)參數(shù)函數(shù)C++程序設(shè)計(jì)第61頁3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制3.3遞歸函數(shù)3.4默認(rèn)參數(shù)函數(shù)3.5內(nèi)聯(lián)函數(shù)
3.6函數(shù)模板3.7變量作用域C++程序設(shè)計(jì)第62頁3.5內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)(也稱在線函數(shù))是在C++中為提升程序運(yùn)行效率而引入。全部函數(shù)調(diào)用時(shí)都會(huì)產(chǎn)生一些額外開銷,主要是系統(tǒng)棧保護(hù)、代碼傳遞、系統(tǒng)棧恢復(fù)以及參數(shù)傳遞等。對(duì)于一些函數(shù)體很小但又經(jīng)常使用函數(shù),因?yàn)楸徽{(diào)用頻率非常高,這種額外開銷也就很可觀,有時(shí)甚至?xí)?duì)運(yùn)行效率產(chǎn)生本質(zhì)影響。C++程序設(shè)計(jì)第63頁
使用內(nèi)聯(lián)函數(shù)正是處理這一問題伎倆。
內(nèi)聯(lián)函數(shù)不是在調(diào)用時(shí)發(fā)生轉(zhuǎn)移,而是在編譯時(shí)將函數(shù)體嵌入在每一個(gè)調(diào)用語句處。這么就相對(duì)節(jié)約了參數(shù)傳遞、系統(tǒng)棧保護(hù)與恢復(fù)等開銷。
內(nèi)聯(lián)函數(shù)在定義時(shí)使用關(guān)鍵字inline區(qū)分于普通函數(shù),其語法形式以下:
<inline><類型標(biāo)識(shí)符><被調(diào)函數(shù)名>(含類型說明形參表){函數(shù)體}3.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第64頁比如:
inlineintmul(inta,intb){returna*b;}
當(dāng)程序中出現(xiàn)mul(2+3,4)函數(shù)調(diào)用時(shí),編譯程序就會(huì)將其擴(kuò)展為(2+3)*4。關(guān)鍵字inline是一個(gè)編譯命令,編譯程序在碰到這個(gè)命令時(shí)將統(tǒng)計(jì)下來,在處理內(nèi)聯(lián)函數(shù)調(diào)用時(shí),編譯程序就試圖產(chǎn)生擴(kuò)展碼。這么從使用者角度來看,內(nèi)聯(lián)函數(shù)在語法上與普通函數(shù)沒有什么區(qū)分,只是在編譯程序生成目標(biāo)代碼時(shí)才區(qū)分處理。3.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第65頁注意:
①內(nèi)聯(lián)函數(shù)體內(nèi)普通不能有循環(huán)語句和switch語句。②內(nèi)聯(lián)函數(shù)定義必須出現(xiàn)在第一次被調(diào)用之前。
假如違反了上述注意事項(xiàng)中任一項(xiàng),編譯程序就會(huì)無視關(guān)鍵字inline存在,像處理普通函數(shù)一樣處理,不生成擴(kuò)展代碼。所以,只有很簡(jiǎn)單而使用頻率很高函數(shù)才被說明為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)會(huì)擴(kuò)大目標(biāo)代碼,使用時(shí)要慎重。3.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第66頁【例8】?jī)?nèi)聯(lián)函數(shù)例題。#include<iostream.h>#include<iomanip.h>inlineintmax(inta,intb){ if(a>b) returna; else returnb;}3.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第67頁voidmain(){ inta,b,c,d; a=210; b=150; c=20; d=max(a,b); d=max(d,c); //編譯時(shí)兩個(gè)調(diào)用處均被替換為max函數(shù)體語句。3.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第68頁
cout<<"Thebiggestof" <<setw(5)<<a <<setw(5)<<b<<setw(5)<<c<<"is"<<d<<endl;}程序運(yùn)行結(jié)果為Thebiggestof21015020is2103.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第69頁回顧C(jī)++程序設(shè)計(jì)第70頁默認(rèn)形參值必須按從右向左次序定義。在有默認(rèn)值形參右面,不能出現(xiàn)無默認(rèn)值形參。因?yàn)樵谡{(diào)用時(shí),實(shí)參初始化形參是按從左向右次序。比如:voidtry(intj=3,intk) voidtry(intj,intk=2,intm) voidtry(intj,intk=7) voidtry(intj,intk=2,intm=3) voidtry(intj=3,intk=2,intm=3)//非法//非法//正當(dāng)//正當(dāng)//正當(dāng)3.4默認(rèn)參數(shù)函數(shù)C++程序設(shè)計(jì)第71頁
使用內(nèi)聯(lián)函數(shù)正是處理這一問題伎倆。
內(nèi)聯(lián)函數(shù)不是在調(diào)用時(shí)發(fā)生轉(zhuǎn)移,而是在編譯時(shí)將函數(shù)體嵌入在每一個(gè)調(diào)用語句處。這么就相對(duì)節(jié)約了參數(shù)傳遞、系統(tǒng)棧保護(hù)與恢復(fù)等開銷。
內(nèi)聯(lián)函數(shù)在定義時(shí)使用關(guān)鍵字inline區(qū)分于普通函數(shù),其語法形式以下:
<inline><類型標(biāo)識(shí)符><被調(diào)函數(shù)名>(含類型說明形參表){函數(shù)體}3.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第72頁注意:
①內(nèi)聯(lián)函數(shù)體內(nèi)普通不能有循環(huán)語句和switch語句。②內(nèi)聯(lián)函數(shù)定義必須出現(xiàn)在第一次被調(diào)用之前。③對(duì)內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口申明。假如違反了上述注意事項(xiàng)中任一項(xiàng),編譯程序就會(huì)無視關(guān)鍵字inline存在,像處理普通函數(shù)一樣處理,不生成擴(kuò)展代碼。所以,只有很簡(jiǎn)單而使用頻率很高函數(shù)才被說明為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)會(huì)擴(kuò)大目標(biāo)代碼,使用時(shí)要慎重。3.5內(nèi)聯(lián)函數(shù)C++程序設(shè)計(jì)第73頁3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制3.3遞歸函數(shù)3.4默認(rèn)參數(shù)函數(shù)3.5內(nèi)聯(lián)函數(shù)3.6函數(shù)重載3.7函數(shù)模板3.8變量作用域C++程序設(shè)計(jì)第74頁【例7-9】#include<iostream.h>intadd(intx,inty){ return(x+y);}doubleadd(doublex,doubley){ return(x+y);}3.6函數(shù)重載C++程序設(shè)計(jì)第75頁intadd(intx,inty,intz){return(x+y+z);}voidmain(){ inta,b,c; a=add(5,10);b=add(5.7,10.3); c=add(5,10,20); cout<<"a="<<a<<"b="<<b<<endl;}程序運(yùn)行結(jié)果為a=15b=16.0c=353.6函數(shù)重載C++程序設(shè)計(jì)第76頁3.6函數(shù)重載
C++允許功效相近函數(shù)在相同作用域內(nèi)以相同函數(shù)名申明,從而形成重載。函數(shù)重載是指一個(gè)函數(shù)名能夠有多個(gè)函數(shù)實(shí)現(xiàn)。方便使用,便于記憶。
C++編譯器在進(jìn)行函數(shù)調(diào)用時(shí)是依據(jù)函數(shù)名和函數(shù)參數(shù)來決定調(diào)用哪一個(gè)函數(shù),所以對(duì)于函數(shù)名重載問題,要區(qū)分函數(shù)名相同函數(shù),只有從它們參數(shù)上進(jìn)行區(qū)分。例:形參類型不一樣
int
add(intx,
inty);floatadd(floatx,floaty);形參個(gè)數(shù)不一樣intadd(intx,inty);intadd(intx,inty,intz);C++程序設(shè)計(jì)第77頁3.6函數(shù)重載intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來區(qū)分intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來區(qū)分重載函數(shù)形參必須不一樣:
個(gè)數(shù)不一樣或類型不一樣。編譯程序?qū)⒁罁?jù)實(shí)參和形參類型及個(gè)數(shù)最正確匹配來選擇調(diào)用哪一個(gè)函數(shù)。注意:C++程序設(shè)計(jì)第78頁3.6函數(shù)重載不要將不一樣功效函數(shù)申明為重載函數(shù),以免出現(xiàn)調(diào)用結(jié)果誤解、混同。這么不好:intadd(intx,inty){returnx+y;}floatadd(floatx,floaty){return
x-y;}注意:C++程序設(shè)計(jì)第79頁3.6函數(shù)重載例子例9
:編寫三個(gè)名為add重載函數(shù),分別實(shí)現(xiàn)兩整數(shù)相加、兩浮點(diǎn)數(shù)相加和三個(gè)整數(shù)相加功效。C++程序設(shè)計(jì)第80頁【例9】#include<iostream.h>intadd(intx,inty){ return(x+y);}doubleadd(doublex,doubley){ return(x+y);}3.6函數(shù)重載C++程序設(shè)計(jì)第81頁intadd(intx,inty,intz){return(x+y+z);}voidmain(){ inta,b,c; a=add(5,10);b=add(5.7,10.3); c=add(5,10,20); cout<<"a="<<a<<"b="<<b<<endl;}程序運(yùn)行結(jié)果為a=15b=16.0c=353.6函數(shù)重載C++程序設(shè)計(jì)第82頁3.1函數(shù)定義與使用3.2函數(shù)調(diào)用機(jī)制3.3遞歸函數(shù)3.4默認(rèn)參數(shù)函數(shù)3.5內(nèi)聯(lián)函數(shù)3.6函數(shù)重載3.7函數(shù)模板
3.8變量作用域C++程序設(shè)計(jì)第83頁3.7函數(shù)模板有很多時(shí)候,我們希望所設(shè)計(jì)算法能夠處理各種數(shù)據(jù)類型。不過,即使這一算法被設(shè)計(jì)為重載函數(shù),也只是使用相同函數(shù)名,函數(shù)體依然要分別定義。以下面兩個(gè)求較小值函數(shù):C++程序設(shè)計(jì)第84頁例7-10
intsmall(intx,inty){returnx<y?x:y;}
doublesmall(doublex,doubley){returnx<y?x:y;
}
考查以上兩個(gè)函數(shù),有什么特點(diǎn)?只有參數(shù)類型不一樣,返回值類型不一樣,功效則完全一樣。類似這么情況,能夠使用函數(shù)模板,從而防止函數(shù)體重復(fù)定義。3.7函數(shù)模板C++程序設(shè)計(jì)第85頁函數(shù)模板能夠用來創(chuàng)建一個(gè)通用功效函數(shù),以支持各種不一樣形參,簡(jiǎn)化重載函數(shù)函數(shù)體設(shè)計(jì)。它最大特點(diǎn)是把函數(shù)所使用數(shù)據(jù)類型作為參數(shù)。
函數(shù)模板定義形式以下:
<template><typename標(biāo)識(shí)符>{
函數(shù)定義
}
3.7函數(shù)模板C++程序設(shè)計(jì)第86頁#include<iostream.h>template<typenameT>Tsmall(T
x,Ty){ returnx<y?x:y;}voidmain()3.7函數(shù)模板C++程序設(shè)計(jì)第87頁{ intm=1,n=8; doubleu=5.5,v=99.3; small(m,n); //整型
small(u,v);}3.7函數(shù)模板C++程序設(shè)計(jì)第88頁intsmall(int
x,inty){ returnx<y?x:y;}small(m,n);//m,n是int型3.7函數(shù)模板C++程序設(shè)計(jì)第89頁floatsmall(float
x,floaty){ returnx<y?x:y;}small(u,v);//m,n是float型3.7函數(shù)模板C++程序設(shè)計(jì)第90頁【例7-11】定義一個(gè)能交換兩個(gè)變量值函數(shù),要求用模板函數(shù)實(shí)現(xiàn)。#include<iostream.h>template<typenameT>voidswap(T
&x,T&y){
Tz; z=y;y=x;x=z;}voidmain()3.7函數(shù)模板C++程序設(shè)計(jì)第91頁{ intm=1,n=8; doubleu=-5.5,v=99.3; cout<<"m="<<m<<"n="<<n<<endl; cout<<"u="<<u<<"v="<<v<<endl; swap(m,n); //整型
swap(u,v); //雙精度型
cout<<"m與n,u與v交換以后:"<<endl; cout<<"m="<<m<<"n="<<n<<endl; cout<<"u="<<u<<"v="<<v<<endl;}3.7函數(shù)模板C++程序設(shè)計(jì)第92頁程序運(yùn)行結(jié)果為:m=1n=8u=-5.5v=99.3m與n,u與v交換以后:
m=8n=1u=99.3v=-5.5
分析:編譯系統(tǒng)從調(diào)用swap()時(shí),依據(jù)實(shí)參類型推導(dǎo)出函數(shù)模板類型參數(shù)。3.7函數(shù)模板C++程序設(shè)計(jì)第93頁于調(diào)用swap(m,n),因?yàn)閷?shí)參m及n為int類型,所以,推導(dǎo)出模板中類型參數(shù)T為int。
當(dāng)類型參數(shù)含義確定后,編譯器將以函數(shù)模板為樣板生成一個(gè)函數(shù):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024河南省建筑安裝技工學(xué)校工作人員招聘考試及答案
- 股權(quán)回購(gòu)合同范本
- 網(wǎng)絡(luò)安全評(píng)估與防護(hù)合同
- 商品混凝土配送合同范本
- 電力采購(gòu)合同范本
- 男生皮膚管理對(duì)比
- 國(guó)際物流模擬考試題與答案
- 現(xiàn)編現(xiàn)代企業(yè)管理
- 自制平板車應(yīng)用管理
- 腸造口特色護(hù)理
- 幼兒園優(yōu)質(zhì)公開課:小班綜合《小雞過生日》課件
- 《新媒體推廣》項(xiàng)目二圖文推廣-課前自學(xué)
- 掛籃檢查驗(yàn)收記錄表
- (完整版)好撒瑪利亞人
- PCB的DFM評(píng)審報(bào)告模板
- 護(hù)理培訓(xùn)學(xué)習(xí)記錄表
- CNAS-CL01:2018《檢測(cè)和校準(zhǔn)實(shí)驗(yàn)室能力認(rèn)可準(zhǔn)則》
- 中國(guó)移動(dòng)公司物業(yè)管理方案
- 團(tuán)結(jié)就是力量(曲譜和歌詞)
- 學(xué)士成都地鐵牽引變電所設(shè)計(jì)論文
- 特種設(shè)備起重機(jī)械設(shè)備(行車)專項(xiàng)檢查細(xì)則表
評(píng)論
0/150
提交評(píng)論