It計算機課件 第4章 函數(shù)_第1頁
It計算機課件 第4章 函數(shù)_第2頁
It計算機課件 第4章 函數(shù)_第3頁
It計算機課件 第4章 函數(shù)_第4頁
It計算機課件 第4章 函數(shù)_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

<學(xué)出瓶士

X

-/丁

C

+

+

設(shè)

第4章函數(shù)

4

、草

數(shù)

1

信華學(xué)出瓶社量扁翱制|孱

C71,''―/■fff."iT\:I/AHyKn<*>>Ju2CJA..,<

+

+

語第4章函數(shù)

序令學(xué)習(xí)目標

設(shè)

程1.掌握函數(shù)的聲明和定義、函數(shù)的調(diào)用及函數(shù)的參數(shù)

傳遞過程;

2.掌握關(guān)鍵字inline的含義與使用;

43.掌握遞歸函數(shù)的使用;

、

草4.掌握函數(shù)重載的使用方法;

數(shù)5.掌握函數(shù)模板的使用方法;

6.了解各類系統(tǒng)函數(shù),掌握常用的系統(tǒng)函數(shù)的使用。

2

C/「一XJ/」,.二F*???***二^//)四*~gE_<尊/<^尸**丹"片wfj■"0/*^/■

+

+4.1函數(shù)的定義和聲明

程4.1.1函數(shù)的定義

設(shè)函數(shù)是一人命名的程序代碼塊,是程序完成其操作的場所,是將功

計能重復(fù)的程序段抽象出來所形成一個獨立的、可重復(fù)使用的功能模塊。

程定義函數(shù)的一般格式為:▲

返回類型函數(shù)名(裂類型1參數(shù)1,數(shù)據(jù)類型2參數(shù)2「)

4語句序列;

、形參表

數(shù)

行說明:

>函數(shù)必須先定義才可以使用

>定義函數(shù)就是編寫完成函數(shù)功能的程序塊。

3

利華廣字廳被包

C

+

+

語4.1函數(shù)的定義和聲明

言在函數(shù)的定義中:

程>返回類型為函數(shù)返回值的類型,可以是系統(tǒng)任一基本數(shù)據(jù)類型或用戶已定義

的一種數(shù)據(jù)類型,它是函數(shù)執(zhí)行過程中通過return語句要求的返回值的類型,

設(shè)

計又稱為該函數(shù)的類型。當一個函數(shù)不需要通過return語句返回一個值時,稱

教為無返回值函數(shù)或無類型函數(shù),此時需要使用void作為類型名。

程>函數(shù)名是用戶為函數(shù)所起的名字,它是一個標識符,應(yīng)符合C++標識符的一般

命名規(guī)則,用戶通過使用這個函數(shù)名和實參表可以調(diào)用該函數(shù)。

>形式參數(shù)表可以包含任意多項(可以沒有),當多于一項時,前后兩個參數(shù)之

第間必須用逗號分開。

4>用花括號括起來的語句序列組成了函數(shù)體,即函數(shù)所完成的具體操作,函數(shù)

、

草體一般分為3部分:第1部分為定義部分,定義函數(shù)所需要的局部常量與局部

函變量;第2部分為函數(shù)的功能部分,完成函數(shù)的功能;第3部分為返回值部分,

數(shù)返回函數(shù)的結(jié)果。如果函數(shù)體中沒有任何語句,該函數(shù)稱作空函數(shù)。

>每個函數(shù)都是一個功能獨立的模塊,絕不允許在一個函數(shù)體內(nèi)定義另一個函

數(shù)。

C

+

+4.1函數(shù)的定義和聲明

語[I**********************************

言2*p4_1.cpp*

*函數(shù)的使用,對兩個數(shù)取大*

序3

4***********************************I

設(shè)

計5#include<iostream>函數(shù)定義

教6usingnamespacestd;

7intmax(intx,inty)i

8{r----------------------------:~~-

9intz;函數(shù)體:函數(shù)所完成

第10z=(x>y)?x:y;一^的具體操作一

411returnz;

數(shù)

5

C信單人字5被在頡顫HR初遇I及9星國H

+

+4.1函數(shù)的定義和聲明

序在C++程序中,使用函數(shù)前首先需要對函數(shù)原型進行聲

設(shè)

計明,告訴編譯器函數(shù)的名稱、類型和形式參數(shù)。

程卜C++中,函數(shù)原型聲明原則如下:H

(1)如果函數(shù)定義在先,調(diào)用在后,調(diào)用前可以不必聲明;

4如果函數(shù)定義在后,調(diào)用在先,調(diào)用前必須聲明。

、

草(2)在程序設(shè)計中,為了使程序設(shè)計的邏輯結(jié)構(gòu)清晰,一般

數(shù)將主要的函數(shù)放在程序的起始位置聲明,這樣也起到了

列函數(shù)目錄的作用。

利華廣字廳被包

CIWI

+

+

語4.1.2函數(shù)原型的聲明

程在C++中,函數(shù)原型聲明原則如下:

設(shè)(1)如果函數(shù)定義在先,調(diào)用在后,調(diào)用前可以不必聲明;如果函

計數(shù)定義在后,調(diào)用在先,調(diào)用前必須聲明。

教(2)在程序設(shè)計中,為了使程序設(shè)計的邏輯結(jié)構(gòu)清晰,一般將主要

的函數(shù)放在程序的起始位置聲明,這樣也起到了列函數(shù)目錄的作用。

聲明函數(shù)原型的形式如下:

4

、

草返回類型函數(shù)名(數(shù)據(jù)類型1參數(shù)1,數(shù)據(jù)類型2參數(shù)2,…);

數(shù)

例如:

intmax(intx,inty);—==32^?加上參數(shù)名會使函數(shù)函

intmax(intjnt);[、功能和參藪更清晰。,

7

清華袁學(xué)出版社‘鴛f皓

C""*/整e廠*.,CJ*rfMi/JuC3r?^5?!竧yj?>

+

+4.1.2函數(shù)原型的聲明

言函數(shù)調(diào)用的一般形式為:

序函數(shù)名(參數(shù)1,參數(shù)2,...);

設(shè)

,__________)

計Y

教實際參數(shù)表

>各實際參數(shù)表中的實際參數(shù)應(yīng)與形參表中的形參一一對應(yīng),即個數(shù)相等且對應(yīng)參數(shù)

的數(shù)據(jù)類型相同。

>函數(shù)調(diào)用是一個表達式,函數(shù)名連同括號是函數(shù)調(diào)用運算符。表達式的值就是被調(diào)

4函數(shù)的返回值,它的類型就是函數(shù)定義中指定的函數(shù)返回值的類型,即函數(shù)的類型。

>如果函數(shù)的返回值為void,說明該函數(shù)沒有返回值。

、

例如:

數(shù)cout?max(a,b)?endl;

招注音-

主函數(shù)main()不需要進行原型語聲明,也不允許任何函數(shù)調(diào)用它,它只由操作系統(tǒng)調(diào)用

并返回操作系統(tǒng)。

8

清華方學(xué)出扳社

C

+

+4.2.2函數(shù)調(diào)用的執(zhí)行過程

程當調(diào)用一個函數(shù)時,整個調(diào)用過程分為三步進行:

設(shè)第一步:函數(shù)調(diào)用;

計①將函數(shù)調(diào)用語句下一條語句的地址保存在一種稱為“?!钡膬?nèi)存中空間

中,以便函數(shù)調(diào)用完后返回。

將數(shù)據(jù)放到??臻g中的過程稱為壓棧。

②對實參表從后向前,依次計算出實參表達式的值,并將值壓棧。

③轉(zhuǎn)跳到函數(shù)體處。

4

、

草第二步:函數(shù)體執(zhí)行,即逐條運行函數(shù)體中語句的過程。

函④如果函數(shù)中還定義了變量,將變量壓棧。

數(shù)

⑤將每一個形參以棧中對應(yīng)的實參值取代,執(zhí)行函數(shù)的功能體。

⑥將函數(shù)體中的變量、保存在棧中的實參值,依次從棧中取出,以釋放棧

空間。從棧中取出數(shù)據(jù)稱為出棧,X出棧用pop(x)表示。

第三步:返回,即返回到函數(shù)調(diào)用表達式的位置。

⑦返回過程執(zhí)行的是函數(shù)體中的return語句。.

C

+

+4.2.2函數(shù)調(diào)用的執(zhí)行過程

程以函數(shù)max()為例,演示函數(shù)調(diào)用的詳細過程如圖4-1所示

執(zhí)行代碼內(nèi)存

設(shè)

100B0000:④push(z)max()定義部分

⑤max([bp-8],[bp-4])

程max()功能體

==>[bp-12]

⑥pop(z)max()執(zhí)行碼

@pop(x)

第?pop(y)棧內(nèi)存

4⑦jump(pop())

、

函bp-12:

數(shù)①push(l00B0A43)bp-8:

②push(b)bp-4:0

調(diào)用max(a,b)

②push(a)bp:100B0A43

?jump100B0000

100B0A43:____bb)之后的語句

10

淆華十字出旃社...

C

+

+4.2.3函數(shù)參數(shù)的按值傳遞

程函數(shù)調(diào)用過程實際上執(zhí)行了一個從參數(shù)傳遞--執(zhí)行函數(shù)體-一返

序回的過程。其中的函數(shù)參數(shù)傳遞過程的實質(zhì)是將實參值通過??臻g

設(shè)一一傳送給實參的過程,這種把實參表達式的值傳送給對應(yīng)的形參

教變量傳遞方式稱為“按值傳遞”。

4

數(shù)

11

等,[.匕_二學(xué)年X什

/l‘"""'1/J>■1-'JJIZz*;,■9

C

+

+4.2.3函數(shù)參數(shù)的按值傳遞

語[I**************************************

言2*p4_2.cpp*

*函數(shù)的傳值調(diào)用,將兩個數(shù)交換*

序3

設(shè)

9intt;

4

、

數(shù)

摩華土學(xué)出扳社

CIWI

+

+4.2.4嵌套調(diào)用

言在一個函數(shù)中調(diào)用其它函數(shù)叫函數(shù)的嵌套。C++中函數(shù)的定義是平行的,

程除了main。以外,都可以互相調(diào)用。函數(shù)不可以嵌套定義,但可以嵌套調(diào)

序用。比如函數(shù)1調(diào)用了函數(shù)2,函數(shù)2再調(diào)用函數(shù)3,這便形成了函數(shù)的嵌套

設(shè)調(diào)用。

教[/**************************************************************

2*p4_3.cpp*

3*函數(shù)的嵌套調(diào)用,求三個數(shù)中最大數(shù)和最小數(shù)的差值*

A**************************************************************/

第5#include<iostream>

4

6usingnamespacestd;

、

草7intmax(intx,inty,intz

8

數(shù)

9intt;

函數(shù)定義

10t=x>y?x:y;

11return(t>z?t:z);

12}

13

淆華丁字出的孑干....-

/JJ<J",一"Ji--▼K?二:t,"/?:,「,’■//'?1,/?/=—.“一Lr*.「7?r?/二,=」,..

C

+13intmin(intx,inty,intz)

+

14{

15intt;

程16t=x<y?x:y;

序17return(t<z?t:z);

設(shè)18)

19intdif(intx,inty,intz)

程20{

21returnmax(x,y,z)-min(x,y,z);

22}

23voidmain()-----------

第24{嵌套調(diào)用

4

25inta,b,c;

函26cin?a?b?c;

數(shù)27cout?"Max-Min="<<dif(a,b,c)?endl;

28)

一運行結(jié)果:一

》5-615/

》21

-

清華廣字出版社,--------

CJ*tI、**Fr*\Sff**7''--J*ylyf'**?E/JuCjfl-71€*P

+

+4.2.4遞歸調(diào)用

程在調(diào)用一個函數(shù)的過程中又直接或間接地調(diào)用該函數(shù)

設(shè)本身的這一現(xiàn)象,叫做函數(shù)的遞歸調(diào)用。

程〃1(n=0)

n!二y

第<n(n-l)!(n>0)

4

、

草?遞歸可以分為直接遞歸調(diào)用和間接遞歸調(diào)用。

數(shù)

直接遞歸調(diào)用:是在調(diào)用函數(shù)的過程中又調(diào)用該函數(shù)本身;

間接遞歸調(diào)用:是在調(diào)用fl()函數(shù)的過程中調(diào)用f2()函數(shù),而f2()中

又需要調(diào)用門()。

15

滑工咨理學(xué)出版社;立出皓用茄M的抗時汁-'=2

C*,?"ffA*?fr*?,廠T\.j/Af:M.r*-M*]JuC2#=1尸夕f*frr*.**

+

+4.2.4遞歸調(diào)用

言遞歸方法是從結(jié)果出發(fā),歸納出后一結(jié)果與前一結(jié)果直到初值為

序止存在的關(guān)系,要求通過分析得到:初值+遞歸函數(shù),然后設(shè)計一個

設(shè)函數(shù)(遞歸函數(shù)),這個函數(shù)不斷使用下一級值調(diào)用自身,直到結(jié)

教果已知處。

遞歸函數(shù)設(shè)計的一般形式是:

第函數(shù)類型遞歸函數(shù)名f(參數(shù)X)

4{

、

草if(滿足結(jié)束條件)

函結(jié)果二初值;

數(shù)

else

結(jié)果二含f(x-1)的表達式;

返回結(jié)果;

16

清華袞學(xué)國戒社’皙t朋

C*2/少廠?5C///77^2-?^Jz2ZrV

+

+4.2.4遞歸調(diào)用

I************************************************

序2*p4_4.cpp

設(shè)3*函數(shù)的遞歸調(diào)用,求n!

計4***********************************************

程5#include<iostream>

6usingnamespacestd;

7intfac(intn)

8{______________

第9Stt;「遞歸函數(shù)定義?

4

、

草IMif(n==1)/'--------

函11t=1;

12else/

數(shù)

13t=n*fac(n-1);

14return(t);

15}

17

清華二學(xué)出版近一變二-----

C9’

+

+4.2.4遞歸調(diào)用

言16voidmain()

序17{constintmax_n=12;〃int類型數(shù)能表示的n!的最大的n

設(shè)18intn;______________

計19cout?,,lnputaintegernumber:";匚遞歸函數(shù)調(diào)用

程20cin?n;

21if(n>=1&&n<=max_n)

22cout?"Factorialof"?n?"is:"?fac(n)?endl;

第23else

24cout?"lnvalidn."?endL____________________________________

運行結(jié)果:

12/

479001600

遞歸程序分兩個階段執(zhí)行:

①調(diào)用:欲求fac(n)-*先求fac(nT)ffac(n-2)...-*fac(1)

若fac(l)已知,回推結(jié)束。

②回代:知道fac(1)f可求出fac(2)->fac⑶f...-(n)

18

音4.匕-「步二行,十

r

C/尸],二。J"./11—1*/12^*#-*

+

+4.2.4遞歸調(diào)用

程函數(shù)參數(shù)傳遞過程:

設(shè)

4

19

清華方學(xué)出扳社

CIWI

+

+4.2.4遞歸調(diào)用

程【例4-5】漢諾塔(TowerofHanoi)問題。

設(shè)有三根柱子A、B、CoA柱上有從小到大排列的n個盤,要求把這

計些盤全部搬到C柱上,可以利用空的B柱;但是每次只能搬動一個盤,

教且在搬動時每個柱子上必須保持盤從小到大的排列次序。如,當盤

數(shù)n二3時搬動步驟為:(1,A->C),(2,A->B),(2,C->B),(3,A-

>C),(1,B->A),(2,B->C),(1,A->C)O

4

、

數(shù)

B(輔助)C(目標)

20

清華尢學(xué)出版社

C

+

+4.2.4遞歸調(diào)用

語分析:

程將n個盤子從A柱移到C柱可分解為以下3步:

設(shè)

A(源)B(輔助)C(目標)

①將A柱上-1個盤子借助于C柱先移到B柱;

4

、

數(shù)

②將A柱上剩下的第n個盤子移到C柱:

2

3

4

③將B柱上n-1個盤子借助A移到C柱。21

音小匕一「學(xué)年二萬士十

C

+4.2:4遞歸調(diào)用

[/*******************************

言2*p4_5.cpp*

程3*漢諾塔問題*

序4*******************************/

設(shè)

5include<iostream>

教6usingnamespacestd;

程7voidmove(intn,charsource,chartarget)

8(

9cout?"("?n?","?source?"—>"?target?")"?endl;

10)

第11voidhanoi(intn,charA,charB,charC)

4

12{一------------

、

草13if(n==1)遞歸函數(shù)定義

函------------------------------

14move(1,A,C);

數(shù)

15else{

16hanoi(n-1,A,C,B);

17move(n,A,C);

18hanoi(n-1,B,A,C);

19)

20)

22

C清華玄二學(xué)出版社

+

+4.2.4遞歸調(diào)用

言21voidmain()

序22{

設(shè)23intnum;

教24cout?"lnputthenumberofdiskes";

程25cin?num;遞歸函數(shù)調(diào)用

26hanoi(num,'A','B','C);

27)

第運行結(jié)果:

4

J55tL

早Inputthenumberofdiskes3/

(1,A—>C)

函(2,A—>B)

數(shù)

(2,C—>B)

(3,A->C)

(1,B—>A)

(2,B—>C)

(1,A—>C)

23

清華方學(xué)出扳社

C

+

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

語4.3

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

序是通過在編譯時將函數(shù)體代碼插入到函數(shù)調(diào)用處,將調(diào)用函數(shù)的方

設(shè)式改為順序執(zhí)行方式來節(jié)省程序執(zhí)行的時間開銷,這一過程叫做內(nèi)聯(lián)

教函數(shù)的擴展。因此,內(nèi)聯(lián)函數(shù)實際上是一種用空間換時間的方案。

內(nèi)聯(lián)函數(shù)的定義形式如下:

第inline函數(shù)類型函數(shù)名(形式參數(shù)表)

4

、

函數(shù)體;

數(shù)

在內(nèi)聯(lián)函數(shù)擴展時也進行了實參與形參結(jié)合的過程:先將實參名

(而不是實參值),將函數(shù)體中的形參處處替換,然后搬到調(diào)用處。但

從用戶的角度看,調(diào)用內(nèi)聯(lián)函數(shù)和一般函數(shù)沒有任何區(qū)別。

24

清華玄工學(xué)出版社

C

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

+4.3

語1I/**********************************

言2*p4_6.cpp*

3*內(nèi)聯(lián)函數(shù)的使用*

**********************************/

設(shè)4

計5#include<iostream>內(nèi)聯(lián)函數(shù)定義

教6usingnamespacestd;

7inlinedoubleCirArea(doubleradius)

8

9return3.14*radius*radius;

第10}

411voidmain()

、

草12

13doubler1(1.0),r2(2);廠內(nèi)聯(lián)函數(shù)調(diào)用

數(shù)

14cout?CirArea(r1)?endl;1—

15cout?CirArea(r1+r2+4)?endl;

16}

運行結(jié)果:

12/

47900160025

利華廣字廳被包

CIWI

+

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

語4.3

程由于計算機的資源總是有限的,使用內(nèi)聯(lián)函數(shù)雖然節(jié)省了程序運行的時

序間開銷,但卻增大了代碼占用內(nèi)存的空間開銷。因此在具體編程時應(yīng)仔細地

設(shè)權(quán)衡時間開銷與空間開銷之間的矛盾,以確定是否采用內(nèi)聯(lián)函數(shù)。

教與處理register變量相似,是否對一個內(nèi)聯(lián)函數(shù)進行擴展完全由編譯器

程自行決定。因此,說明一個內(nèi)聯(lián)函數(shù)只是請求而不是命令編譯器對它進行擴

展。事實上,如果將一個較復(fù)雜的函數(shù)定義為內(nèi)聯(lián)函數(shù),大多數(shù)編譯器會自

動地將其作為普通函數(shù)處理。

4注意:

、

草>如果僅在聲明函數(shù)原型時加上關(guān)鍵字inline,并不能達到內(nèi)聯(lián)效果。

>內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在對該函數(shù)的調(diào)用之前,因為編譯器在

數(shù)

對函數(shù)調(diào)用語句進行替換時,必須事先知道替換該語句的代碼是

什么。這也是僅在聲明函數(shù)原型時加上關(guān)鍵字inline,并不能達到

內(nèi)聯(lián)效果的原因。

26

瘠華十字出版社M總.――

內(nèi)聯(lián)函數(shù)聲明與使用

聲明時使用關(guān)鍵字inlineo

?編譯時在調(diào)用處用函數(shù)體進行替換,節(jié)

省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。

A注意:

>內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語句和switch

語句。

?內(nèi)聯(lián)函數(shù)的聲明必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第

一次被調(diào)用之前。

A對內(nèi)聯(lián)函數(shù)不能進行異常接口聲明。

27

清華之學(xué)出成社

C3*/rr"Ir*?VA—,'vylb/-jr*3*JPP"'fi^'C*ys^TC^

+

+帶默認形參值的函數(shù)

語4.4

C++語言允許在函數(shù)說明或函數(shù)定義中為形參預(yù)賦一個默認的值,

序這樣的函數(shù)就叫做帶有默認形參值的函數(shù)。在調(diào)用帶有默認參數(shù)值的

設(shè)函數(shù)時,若為相應(yīng)形參指定了實參,則形參將使用實參的值;否則,

計形參相使用其默認值。這就大大地方便了函數(shù)的使用。

例如:

intsub(intx=8,inty=3)

第(

4

returnx-y;

、

草}

函voidmain(void)

數(shù)(

sub(20,15);〃傳遞給形參x,y的值分別為20和15

sub(10);〃傳遞給形參x,y的值分別為10和3

sub();〃傳遞給形參x,y的值分別為8和3

}

28

清華之學(xué)出成社

C3*/rr"Ir*?VA—,'vylb/-jr*3*JPP"'fi^'C*ys^TC^

+

+4.4帶默認形參值的函數(shù)

言(1)若函數(shù)具有多個形參,則缺省形參值必須自右向左連續(xù)地定義,并且在一

序個缺省形參值的右邊不能有未指定缺省值的參數(shù)。這是由于C++語言在函數(shù)調(diào)

設(shè)用時參數(shù)是自右至左入棧這一約定所決定的。

教例如:

程intf(inta,floatb=5.0,charc='.',intd=10);〃正確

intf(inta=1,floatb=5.0,charc='.',intd);〃錯誤,d未給值

intf(inta=1,floatb,charc='.',intd=10);〃錯誤,b未給值

4

草(2)在調(diào)用一個函數(shù)時,如果省去了某個實參,則直到最右端的實參都要省去

函(當然,與它們對應(yīng)的形參都要有缺省值)。

數(shù)例如:

假如有如下聲明:

intf(inta,floatb=5.0,charc='.',intd=10);

采用如下調(diào)用形式是錯誤的:

f(8,,,4);〃語法錯誤

29

清華尢學(xué)出版社

CIWI

+

+4.4帶默認形參值的函數(shù)

程(3)缺省形參值的說明必須出現(xiàn)在函數(shù)調(diào)用之前。這就是說,如果存在函數(shù)原型,

序則形參的缺省值應(yīng)在函數(shù)原型中指定;否則在函數(shù)定義中指定。另外,若函數(shù)

設(shè)原型中已給出了形參的缺省值,則在函數(shù)定義中不得重復(fù)指定,即使所指定的

計缺省值完全相同也不行。

程例如:

intsub(intx=8,inty=3);〃缺省形參值在函數(shù)原型中給出

voidmain(void)

intadd(intx=5,inty=6)

4sub(20,15);//20-15

J55tLtreturnx+y;

早sub(10);//10-3

sub();//8-3

函intmain()

數(shù))

//缺省形參值

intsub(intx,inty){add();〃調(diào)用在實現(xiàn)后

沒有在函數(shù)定義時給出

returnx-y;

)

30

r=J>rII?

信華-無字力被包鼻麻鬲洞刪舞騰制費I

C'4;ffV,FL*7'\:rtAnGfjfr//Jf?2fi-i*"^5cT尸-JJRI

+

+4.4帶默認形參值的函數(shù)

(4)在同一個作用域,一旦定義了缺省形參值,就不能再定義它。

例如:

設(shè)

intf(inta,floatb,char,intd=10);

=,

程intf(inta,floatb,charc.',intd=10);〃錯誤:企圖再次定義缺省參數(shù)c和d

(5)如果幾個函數(shù)說明出現(xiàn)在不同的作用域內(nèi),則允許分別為它們提供不同的缺

第省形參值。

4例如:

、

函intf(inta=6,floatb=5.0,charc='.,,intd=10);

數(shù)voidmain(void)

(

intf(inta=3,floatb=2.0,charc=,n',intd=20);

cout?f()?endl;〃f函數(shù)使用局部缺省參數(shù)值

)

31

清華尢學(xué)出版社

Cr--1/.1?/

+

+4.4帶默認形參值的函數(shù)

程例:

序intadd(intx=l,inty=2);

設(shè)

計intmain()

教{intadd(intx=3,inty=4);

程add();〃使用局部默認形參值

(實現(xiàn)3+4)

}

第voidfun(void)

4{...

草add();〃使用全局默認形參值

函(實現(xiàn)1+2)

數(shù)

32

C

+

+4.4帶默認形參值的函數(shù)

(6)對形參缺省值的指定可以是初始化表達式,甚至可以包含函數(shù)調(diào)用。

例如:

〃d參數(shù)的缺省值是函數(shù)調(diào)用。

intf(inta,floatb=5.0,charc-.'Jntd=sub(20,15));

第(7)在函數(shù)原型給出了形參的缺省值時,形參名可以省略。

4

JsbtL

早例如:

函intf(int,float=5.0,char=\,,int=sub(20,15));

數(shù)

33

清華瀛的蓼數(shù)傳遞

用引用做形參

A引用(&)是標識符的別名,是一種特殊類型的

變量。例如:

inti,j;

int&ri=i;

//建立一個int型的引用ri,并將其

〃初始化為變量i的一個別名

j=10;

ri=j;//相當于i=j;

?聲明一個引用時,必須同時對它進行初始化

,使它指向一個已存在的對象。

A一旦一個引用被初始化后,就不能改為指向

其它對象。

?引用可以作為形參

voidswap(int&a,int&b){...}

34

例:輸入兩個整數(shù)交換后輸出

#include<iostream>

usingnamespacestd;

voidSwap(int&a,int&b);

intmain()

{intx(5),y(10);

cout?nx="?x?ny=n?y?endl;

Swap(x,v);

cout?nx="?x?ny=n?y?endl;

return0;

)

voidSwap(int&a,int&b)

{intt;

t=a;運行結(jié)果:

a=b;

b=t;x=5y=10

)x=10y=5

35

S管案尋*麻城引用為參數(shù),達

到交換目的。t=a;

x的別名

a

a_=bb=t;

abb

形參是實參的一個別名,對一一r

形參的任何操作直接影響實一W一

參。xy

36|

C

+

+函數(shù)重載

語4.5

程C++允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名聲明,從而形成重載。

序方便使用,便于記憶。

設(shè)

教函數(shù)重載:

就是兩個以上的函數(shù),取相同的函數(shù)名,但是形參的個數(shù)和類型不同,編

蟒器根據(jù)實參和形參的類型及個數(shù)的最佳匹配,自動決定調(diào)用哪一個函數(shù)。

4

、

草intmax(int,int);

函intmax(int,int,int);

數(shù)floatmax(float,float);

doublemax(double,double);

37

清華尢學(xué)出版社

C

1/******************************

+2

+*p4_7.cpp.

3

語*函數(shù)的重載'

4

言*******************************

程5

#include<iostream>

序6

設(shè)7usingnamespacestd;

計8intadd(intx,inty)----函數(shù)重載

9(

cout?"(int,int)\t";

10

returnx+y;

11

12)函數(shù)重載

第13doubleadd(doublex,doubley)

4

14(

15cout?"(double,double)\r;

16returnx+y;

數(shù)

17}____

18intadd(intx,doubley)"函數(shù)重載

19(

20cout?"(int,double)\tn;

21returnint(x+y);

}

清華尢學(xué)出版社

C

+21

+22

言23

程24

序25

設(shè)

計26voidmain()

教27

28cout?add(9,8)?endl;

重載函數(shù)的調(diào)用

29cout?add(9.0,8.0)?endl

30cout?add(9,8.0)?endTT

431cout?add(9.0,8)?endl;

、

草32)

數(shù)

運行結(jié)果:

(int,int)17

(double,double)17

(int,double)17

(double,int)17

-----------------------------------------------------------------------------------------------------------------------------^9

羽挈十學(xué)出版社

C

+

+4.5函數(shù)重載

言b注意:

程(1)各個重載函數(shù)的返回類型可以相同,也可以不同。但如果函數(shù)名相同、形參表也相

序同,僅僅是返回類型不同,則是非法的。在編譯時會認為是語法錯誤。

設(shè)

計//C++無法區(qū)分這兩個函數(shù)。因為在沒有確定函數(shù)調(diào)用是對哪一個重載的函數(shù)之前,

教〃返回類型是不知道的。

程intadd(intil,inti2);

floatadd(intfl,intf2);

(2)確定對重載函數(shù)的哪個函數(shù)進行調(diào)用的過程稱為綁定(binding),綁定的優(yōu)先次序為

第精確匹配、對實參的類型向高類型轉(zhuǎn)換后的匹配、實參類型向低類型及相容類型轉(zhuǎn)換后

4的匹配。___________________________________________________________________

J55tL

〃將char型轉(zhuǎn)換成int型,然后與add(int,int)綁定。

函add('A','A'+'O');

數(shù)〃函數(shù)實參向(double,double)轉(zhuǎn)換,然后與add(double,double)綁定。

add(float(8),float(9));

〃實參類型為(longdouble,int),向低類型轉(zhuǎn)化。

add(longdouble(8),9);

40

v=J>r^-^irIIL^L一)I

摩華嗟:字身破包

CP-:B,ff."Il/*rjr*-':J?/AJs%TM*fJKJA-->「irr-C^l

+

+函數(shù)重載

語4.5

言綁定(匹配)二義性

程兩個重載函數(shù),編譯器不知道進行哪種類型的轉(zhuǎn)換,與哪個函數(shù)綁定,這

序種現(xiàn)象就叫綁定(匹配)二義性。

設(shè)

計消除這種二義性的辦法有:

教①添加重載函數(shù)定義,使調(diào)用獲得精確匹配。如:增加定義add(long

程double,int)

②將函數(shù)的實參進行強制類型的轉(zhuǎn)換,使調(diào)用獲得精確匹配。

例如:

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論