函數(shù)、函數(shù)與運(yùn)算符重載課件_第1頁(yè)
函數(shù)、函數(shù)與運(yùn)算符重載課件_第2頁(yè)
函數(shù)、函數(shù)與運(yùn)算符重載課件_第3頁(yè)
函數(shù)、函數(shù)與運(yùn)算符重載課件_第4頁(yè)
函數(shù)、函數(shù)與運(yùn)算符重載課件_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

VIP免費(fèi)下載

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

文檔簡(jiǎn)介

函數(shù)、函數(shù)與運(yùn)算符重載§5.2函數(shù)的說(shuō)明與使用五、值調(diào)用和引用調(diào)用1.賦值調(diào)用方式例intmul(intn){n=n*3;returnn;}調(diào)用函數(shù)2次:intn=5;//變量與形參同名cout<<mul(2)<<mul(n)<<n<<endl;執(zhí)行結(jié)果:6155

按值調(diào)用可以防止意外的副作用影響開(kāi)發(fā)正確、可靠的軟件系統(tǒng),但其缺點(diǎn)是如果傳遞較大的數(shù)據(jù)項(xiàng)目,則復(fù)制這個(gè)數(shù)據(jù)可能要占相當(dāng)長(zhǎng)的時(shí)間?!?.2函數(shù)的說(shuō)明與使用五、值調(diào)用和引用調(diào)用2.引用調(diào)用方式⑴引用:引用是給已知的一個(gè)變量起的一個(gè)別名。當(dāng)建立引用時(shí),程序用另一個(gè)變量或?qū)ο蟮拿殖跏蓟?。?duì)引用的改動(dòng),實(shí)際上是對(duì)目標(biāo)的改動(dòng)。

引用定義的格式<類型名>&<引用名>(<變量名>);或者<類型名>&<引用名>=<變量名>;§5.2函數(shù)的說(shuō)明與使用五、值調(diào)用和引用調(diào)用2.引用調(diào)用方式說(shuō)明:①引用在定義時(shí)一定要初始化例

inta=3;

int&m=a;m=m+5;

intn=m;②對(duì)引用的操作就是對(duì)被引用的變量的操作③可以把某個(gè)引用賦給一個(gè)變量,該變量的值就是被引用的變量值④引用一旦初始化后不得作為其他變量的別名#include<iostream.h>voidmain(){intx=3,&y=x;

cout<<“x=”<<x<<endl<<“y=”<<y<<endl;y=7;

cout<<“x=”<<x<<endl<<“y=”<<y<<endl;}§5.2函數(shù)的說(shuō)明與使用五、值調(diào)用和引用調(diào)用2.引用調(diào)用方式例x=3y=3x=7y=7輸出結(jié)果:§5.2函數(shù)的說(shuō)明與使用五、值調(diào)用和引用調(diào)用2.引用調(diào)用方式⑵函數(shù)的引用調(diào)用:

調(diào)用函數(shù)的實(shí)參要用變量名,將實(shí)參變量名賦給形參的引用,相當(dāng)于在被調(diào)用函數(shù)中使用了實(shí)參的別名。如swap(a,b);在函數(shù)原型中該參數(shù)類型后面加上&,如:voidswap(int&x,int&y);§5.2函數(shù)的說(shuō)明與使用五、值調(diào)用和引用調(diào)用2.引用調(diào)用方式⑵函數(shù)的引用調(diào)用:

相比按值調(diào)用,按引用調(diào)用對(duì)性能有利,因?yàn)樗藦?fù)制大量數(shù)據(jù)的開(kāi)銷。但按引用調(diào)用的安全性較差,因?yàn)楸徽{(diào)用函數(shù)能夠直接訪問(wèn)和修改調(diào)用者的數(shù)據(jù)。#include<iostream.h>voidswap(intx,inty){inttemp=x;

x=y;y=temp;

cout<<x<<“”<<y<<endl;}voidmain(){inta=3,b=5;swap(a,b);

cout<<a<<“”<<b<<endl;}#include<iostream.h>voidswap(int&x,int&y){inttemp=x;x=y;y=temp;

cout<<x<<“”<<y<<endl;}voidmain(){inta=3,b=5;swap(a,b);

cout<<a<<“”<<b<<endl;}

在傳值調(diào)用中,swap()函數(shù)中形參值的改變對(duì)實(shí)參無(wú)影響

在引用調(diào)用中,有&x=a,&y=b,因此x和a,y和b同時(shí)改變,從而達(dá)到實(shí)參交換的目的輸出結(jié)果:5335輸出結(jié)果:5353#include<iostream.h>intsquareByValue(int);void

squareByReference(int&);intmain(){intx=2,z=4;

cout<<“x=”<<x<<“beforesquareByValue\n”<<“ValuereturnedbysquareByValue:”<<squareByValue(x)<<endl;<<“x=”<<x<<“aftersquareByValue\n”<<endl;cout<<“z=”<<z<<“beforesquareByReference”<<endl;

squareByReference(z);

cout<<“z=”<<z<<“aftersquareByReference”<<endl;return0;}intsquareByValue(inta){returna*a;}voidsquareByReference(int&cRef){cRef*=cRef;}x=2

beforesquareByValue

ValuereturnedbysquareByValue:4x=2

aftersquareByValue

z=4

beforesquareByReference

z=16

aftersquareByReference

§5.2函數(shù)的說(shuō)明與使用五、值調(diào)用和引用調(diào)用①在一條語(yǔ)句中聲明多個(gè)引用:int&x=a,y=b,z=c;注int&x=a,&y=b,&z=c;√×int&x,y,z;×②聲明引用變量而不對(duì)其進(jìn)行初始化是個(gè)語(yǔ)法錯(cuò)誤.intx=3,&y;//Referencevariable‘y’mustbeinitialized§5.2函數(shù)的說(shuō)明與使用六、函數(shù)的嵌套與遞歸函數(shù)嵌套:一個(gè)函數(shù)的函數(shù)體中包含一個(gè)或多個(gè)函數(shù)調(diào)用語(yǔ)句。①若函數(shù)A要調(diào)用函數(shù)B,則函數(shù)B的定義或函數(shù)原型必須出現(xiàn)在A的定義之前。說(shuō)明②若函數(shù)A在執(zhí)行過(guò)程中調(diào)用B,則中途將程序控制權(quán)轉(zhuǎn)到B,待B執(zhí)行結(jié)束后再返回到A?!?.2函數(shù)的說(shuō)明與使用六、函數(shù)的嵌套與遞歸函數(shù)遞歸:即自調(diào)用函數(shù),在函數(shù)體內(nèi)部直接或間接地自己調(diào)用自己。例如:下面的程序求n!longfact(intn){if(n==1)return1;returnfact(n-1)*n;}§5.2函數(shù)的說(shuō)明與使用六、函數(shù)的嵌套與遞歸函數(shù)遞歸遞推階段:將原有問(wèn)題不斷地分解為新的子問(wèn)題,逐漸從未知向已知的方向推測(cè),最終到達(dá)已知的條件,即遞歸結(jié)束條件,這時(shí)遞推階段結(jié)束。⑴遞歸調(diào)用的過(guò)程回歸階段:從已知條件出發(fā),按照“遞推”的逆過(guò)程,逐一求值回歸,最后到達(dá)遞推的開(kāi)始處,結(jié)束回歸階段,完成遞歸調(diào)用?!?.2函數(shù)的說(shuō)明與使用六、函數(shù)的嵌套與遞歸函數(shù)遞歸#include<iostream.h>intfn(intn){

if(n==1)return1;else

returnf(n-1)+n;}voidmain(){cout<<“s=”<<f(4)<<endl;}#include<iostream.h>intfn(intn){if(n==1)return1;else

returnf(n-1)+n;}voidmain(){cout<<“s=”<<f(4)<<endl;}f(4)f(4)f(4)f(3)f(3)f(2)f(2)f(1)f(4)=f(3)+4f(3)=f(2)+3f(2)=f(1)+2f(4)=6+4=10f(3)=3+3=6f(2)=1+2=3110§5.2函數(shù)的說(shuō)明與使用六、函數(shù)的嵌套與遞歸函數(shù)遞歸⑵遞歸函數(shù)的條件:①須有完成函數(shù)任務(wù)的語(yǔ)句#include<iostream.h>voidcount(int

val){if(val>1)count(val-1);

cout<<“ok”<<val<<endl;}②須有一個(gè)確定是否能避免遞歸調(diào)用的測(cè)試③須有一個(gè)遞歸調(diào)用語(yǔ)句④先測(cè)試,后遞歸調(diào)用§5.2函數(shù)的說(shuō)明與使用七、內(nèi)聯(lián)函數(shù)為什么要引進(jìn)內(nèi)聯(lián)函數(shù)?#include<iostream.h>intisnumber(char);voidmain(){charc;while((c=cin.get())!=‘\n’)

if(isnumber(c))cout<<“Digit\n”;else

cout<<“NotDigit\n”;}intisnumber(charch){return(ch>=‘0’&&ch<=‘9’)?1:0;}#include<iostream.h>intisnumber(char);voidmain(){charc;while((c=cin.get())!=‘\n’)

if((ch>=‘0’&&ch<=‘9’)?1:0)

cout<<“Digit\n”;else

cout<<“NotDigit\n”;}§5.2函數(shù)的說(shuō)明與使用七、內(nèi)聯(lián)函數(shù)2.內(nèi)聯(lián)函數(shù)的定義inline

類型說(shuō)明符被調(diào)用函數(shù)名(形參表)

內(nèi)聯(lián)函數(shù)具有一般函數(shù)的特性,它與一般函數(shù)的不同之處僅在于函數(shù)調(diào)用的處理。內(nèi)聯(lián)函數(shù)在調(diào)用時(shí),是將調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)體來(lái)替換。內(nèi)聯(lián)函數(shù)在開(kāi)始時(shí)僅聲明一次。§5.2函數(shù)的說(shuō)明與使用七、內(nèi)聯(lián)函數(shù)2.內(nèi)聯(lián)函數(shù)的定義#include<iostream.h>inline

intisnumber(char);voidmain(){charc;while((c=cin.get())!=‘\n’)

if(isnumber(c))cout<<“Digit\n”;else

cout<<“NotDigit\n”;}intisnumber(charch){return(ch>=‘0’&&ch<=‘9’)?1:0;}

①內(nèi)聯(lián)函數(shù)必須在被調(diào)用之前聲明或定義。因?yàn)閮?nèi)聯(lián)函數(shù)的代碼必須在被替換之前生成。所以,程序若開(kāi)始時(shí)不聲明為inline,后面有inline也被視為普通函數(shù)。

②內(nèi)聯(lián)函數(shù)中不能含有復(fù)雜的結(jié)構(gòu)控制語(yǔ)句,如switch和循環(huán)語(yǔ)句。如果內(nèi)聯(lián)函數(shù)有這些語(yǔ)句,則編譯將該函數(shù)視為普通函數(shù)那樣產(chǎn)生函數(shù)調(diào)用。③遞歸函數(shù)不能用作內(nèi)聯(lián)函數(shù)。④內(nèi)聯(lián)函數(shù)只適用于1~5行的小函數(shù)。對(duì)一個(gè)含有許多語(yǔ)句的大函數(shù),函數(shù)調(diào)用和返回的開(kāi)銷相對(duì)來(lái)說(shuō)微不足道,沒(méi)必要用內(nèi)聯(lián)函數(shù)來(lái)實(shí)現(xiàn)。

設(shè)計(jì)一個(gè)程序,比較直接運(yùn)行語(yǔ)句(i>j)?i:j;與運(yùn)行內(nèi)聯(lián)函數(shù)和運(yùn)行外部函數(shù)之間的所耗時(shí)間。三者分別運(yùn)行100000000次。i與j循環(huán)變化。析:clock()函數(shù)在time.h中聲明,如果除以常數(shù)CLK_TCK,則為秒數(shù)。CLK_TCK一般內(nèi)定為1000,表示每1000個(gè)時(shí)鐘單位等于1秒。它通常用來(lái)計(jì)算系統(tǒng)運(yùn)行所消耗的準(zhǔn)確時(shí)間。練習(xí)§5.2函數(shù)的說(shuō)明與使用七、內(nèi)聯(lián)函數(shù)2.內(nèi)聯(lián)函數(shù)的定義#include<iostream.h>inline

intisnumber(char);voidmain(){charc;while((c=cin.get())!=‘\n’)

if(isnumber(c))cout<<“Digit\n”;else

cout<<“NotDigit\n”;}intisnumber(charch){return(ch>=‘0’&&ch<=‘9’)?1:0;}⑤利用編譯預(yù)處理的宏定義方式,也可以實(shí)現(xiàn)類似于內(nèi)聯(lián)函數(shù)的功能。不過(guò),內(nèi)聯(lián)函數(shù)的方式更為方便和可靠。

給出下面的宏,請(qǐng)列出使用它時(shí)所有的潛在錯(cuò)誤。最好如何避免?練習(xí)#defineTWO_MAX(x,y)x>y?(2*x):(2*y);#defineTWO_MAX(x,y)x>y?(2*x):(2*y);①如果參數(shù)是一個(gè)表達(dá)式,且?guī)в袃?yōu)先級(jí)低于乘法的運(yùn)算符,結(jié)果將是錯(cuò)的,因?yàn)閤沒(méi)被括號(hào)括住。TWO_MAX(3+a,b)3+a>b?(2*3+a):(2*b)②如果這個(gè)宏被用在一個(gè)表達(dá)式中,且該式中有相同優(yōu)先級(jí)的運(yùn)算符,結(jié)果將是錯(cuò)誤的,因?yàn)樵摫磉_(dá)式?jīng)]有用括號(hào)括住。a=2*TWO_MAX(b,c)a=2*b>c?b:c#defineTWO_MAX(x,y)x>y?(2*x):(2*y);③如果宏被一個(gè)有副作用的參數(shù)實(shí)現(xiàn),該副作用將起兩次作用,因?yàn)閤出現(xiàn)了不止一次。a=TWO_MAX(b++,c)a=b++>c?b++:c#defineTWO_MAX(x,y)(x)>(y)?(2*(x)):(2*(y));inlinetwo_Max(x,y)(intx,inty){returnx>y?(2*x):(2*y);}§5.3函數(shù)與運(yùn)算符的重載一、函數(shù)重載

函數(shù)重載是指同一個(gè)函數(shù)名可以對(duì)應(yīng)著多個(gè)函數(shù)的實(shí)現(xiàn),即支持多個(gè)不同的函數(shù)采用同一名字。intabs(int);longlabs(long);doubledabs(double);C語(yǔ)言intabs(inti);longabs(longl);doubleabs(doubled);C++語(yǔ)言(要求函數(shù)名唯一)§5.3函數(shù)與運(yùn)算符的重載一、函數(shù)重載①C++的函數(shù)如果在返回類型、參數(shù)類型、參數(shù)個(gè)數(shù)、參數(shù)順序上有所不同,則認(rèn)為是不同的。但重載函數(shù)如果僅僅是返回類型不同,則是不夠的,例如下面的聲明是錯(cuò)誤的:說(shuō)明voidfunc(int);intfunc(int);§5.3函數(shù)與運(yùn)算符的重載一、函數(shù)重載舉例說(shuō)明參數(shù)類型不同的重載函數(shù)的實(shí)現(xiàn)例1#include<iostream.h>intabs(intx){returnx>0?x:-x;}floatabs(floatx){returnx>0?x:-x;}voidmain(){

cout<<“-10的絕對(duì)值是:”<<abs(-10)<<endl;

cout<<“-2.5的絕對(duì)值是:”<<abs(-2.5)<<endl;}舉例說(shuō)明參數(shù)個(gè)數(shù)不同的重載函數(shù)的實(shí)現(xiàn)例2#include<iostream.h>intmin(inta,intb){returna<b?a:b;}intmin(inta,intb,intc){intt=min(a,b);returnmin(t,c);}intmin(inta,intb,intc,intd){intt1=min(a,b);intt2=min(c,d);

returnmin(t1,t2);}voidmain(){

cout<<min(13,5,4,9)<<endl;

cout<<min(-2,8,0)<<endl;}§5.3函數(shù)與運(yùn)算符的重載一、函數(shù)重載②typedef定義的類型只能使之相同于一個(gè)已存在的類型,而不能建立新的類型,所以不能用typedef定義的類型名來(lái)區(qū)分重載函數(shù)聲明的參數(shù)。例如下面的代碼實(shí)際上是同一個(gè)函數(shù):說(shuō)明typedefINTint;voidfunc(intx){//…}voidfunc(INTx){//…}//error§5.3函數(shù)與運(yùn)算符的重載一、函數(shù)重載③讓重載函數(shù)執(zhí)行不同的功能,是不好的編程風(fēng)格。同名函數(shù)應(yīng)該具有相同的功能。如果定義一個(gè)abs()函數(shù)而返回的卻是一個(gè)數(shù)的平方根,則程序的可讀性受到破壞。說(shuō)明§5.3函數(shù)與運(yùn)算符的重載一、函數(shù)重載④使用重載,應(yīng)避免產(chǎn)生二義性。說(shuō)明包含缺省參數(shù)時(shí),可能造成二義性。例如:intsum(inta,intb,intc=0);intsum(inta,intb);關(guān)于函數(shù)重載的內(nèi)部實(shí)現(xiàn)C++用名字分割機(jī)制來(lái)改變函數(shù)名,以區(qū)分參數(shù)不同的同名函數(shù)。名字分割機(jī)制是指一系列代碼被加到函數(shù)名上以指示參數(shù)類型以及它們出現(xiàn)的次序。v—voidc—chari—intf—floatl—longd—doubler—longdouble

intf(chara);

intf(chara,intb,doublec);在內(nèi)部分別被表示為:

f_c和

f_cid

而函數(shù)f_cid()被表示為

f_cidv以示區(qū)別§5.3函數(shù)與運(yùn)算符的重載二、運(yùn)算符重載

運(yùn)算符重載的目的是使C++代碼更直觀,更易讀。

運(yùn)算符重載函數(shù)的定義<類型名>operator<運(yùn)算符>(參數(shù)名)如:intoperator+(int,int);§5.3函數(shù)與運(yùn)算符的重載二、運(yùn)算符重載

例:假設(shè)定義enumbool{FALSE,TRUE};用+、-、

*來(lái)表示枚舉類型的或、與、非運(yùn)算。booloperator+(boola,boolb)

{if((a==FALSE)&&(b==FALSE))returnFALSE;returnTRUE;}booloperator*(boola,boolb)

{if((a==TRUE)&&(b==TRUE))returnTRUE;returnFALSE;}booloperator*(boola)

{

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論