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

下載本文檔

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

文檔簡(jiǎn)介

1、1/91第第5 5章章 函數(shù),函數(shù)與運(yùn)算符的重載函數(shù),函數(shù)與運(yùn)算符的重載要點(diǎn)要點(diǎn) 函數(shù)函數(shù) 函數(shù)的重載函數(shù)的重載 運(yùn)算符的重載運(yùn)算符的重載2/91n函數(shù):參數(shù)化的子程序;函數(shù):參數(shù)化的子程序;n從從sp的觀點(diǎn),函數(shù):程序長(zhǎng)度的觀點(diǎn),函數(shù):程序長(zhǎng)度; 整個(gè)程序整個(gè)程序子任務(wù)子任務(wù);n從運(yùn)算的角度,函數(shù)從運(yùn)算的角度,函數(shù):c+提供的用戶定義提供的用戶定義 的運(yùn)算。運(yùn)算符的運(yùn)算。運(yùn)算符:系統(tǒng)提供的運(yùn)算系統(tǒng)提供的運(yùn)算 ;n作為作為oop的的c+,類(lèi),類(lèi):核心,類(lèi)核心,類(lèi)=數(shù)據(jù)數(shù)據(jù)+方法,方法, 方法方法/類(lèi)的函數(shù)成員類(lèi)的函數(shù)成員:對(duì)數(shù)據(jù)的運(yùn)算和處理。對(duì)數(shù)據(jù)的運(yùn)算和處理。函數(shù)在函數(shù)在c+中的意義中的意義

2、3/91例:按照例:按照cardan公式,計(jì)算公式,計(jì)算3次方程次方程x3+px+q=0 的一個(gè)實(shí)根:的一個(gè)實(shí)根: 5.1 3次方程求根程序的設(shè)計(jì)次方程求根程序的設(shè)計(jì)332332)3()2(2)3()2(2pqqpqqxr 方法:方法:(1)計(jì)算浮點(diǎn)數(shù)的立方根的程序作為函數(shù)計(jì)算浮點(diǎn)數(shù)的立方根的程序作為函數(shù) (2)主程序中主程序中2次調(diào)用該函數(shù)次調(diào)用該函數(shù) (3) 計(jì)算計(jì)算 迭代公式:迭代公式:rn+1=2/3*rn+y/(3rn2)3y4/91#include#includefloat cuberoot(float); /原型原型void main(void)float p,q,xr;cout

3、pq;float a=sqrt(q/2*q/2+p/3*p/3*p/3); /xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);coutendlthe real root of the equation is eps);return(croot);3x6/91執(zhí)行結(jié)果執(zhí)行結(jié)果7/91 屬性說(shuō)明屬性說(shuō)明 類(lèi)型類(lèi)型 函數(shù)名函數(shù)名 (參數(shù)表參數(shù)表);5.2 函數(shù)的說(shuō)明與使用函數(shù)的說(shuō)明與使用1.1.函數(shù)說(shuō)明函數(shù)說(shuō)明函數(shù)原型函數(shù)原型/聲明聲明-指出函數(shù)的名稱(chēng),類(lèi)型和參數(shù)指出函數(shù)的名稱(chēng),類(lèi)型和參數(shù)例:例:int add(int a,int b); inline void swap(

4、float&,float&); void print(char *);可省略可省略8/91o inline:內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù) p125o static:靜態(tài)函數(shù)靜態(tài)函數(shù) p170o virtual:虛函數(shù)虛函數(shù) p202o friend:某類(lèi)的友元函數(shù)某類(lèi)的友元函數(shù) p170 屬性說(shuō)明屬性說(shuō)明 類(lèi)型類(lèi)型 函數(shù)名函數(shù)名(參數(shù)表參數(shù)表);可缺省可缺省屬性說(shuō)明屬性說(shuō)明函數(shù)的返函數(shù)的返回類(lèi)型回類(lèi)型標(biāo)識(shí)符標(biāo)識(shí)符除除main()函數(shù)和類(lèi)的構(gòu)造函數(shù)和類(lèi)的構(gòu)造/析構(gòu)函數(shù)之析構(gòu)函數(shù)之外,所有函數(shù)必須指出返回類(lèi)型外,所有函數(shù)必須指出返回類(lèi)型9/91例:例:/program 7_1.cppclass

5、 stack float datamaxsize; int top;public: stack(void); /構(gòu)造函數(shù)構(gòu)造函數(shù) p168 stack(void); /析構(gòu)函數(shù)析構(gòu)函數(shù) p169 ;stack:stack(void) top=0; coutstack initialized.endl;10/91例:例:class point / point:平面上一點(diǎn)平面上一點(diǎn)private: float xcoord,ycoord;public: void setx(float x) xcoord=x;/初始化初始化 void sety(floaty) ycoord=y;/初始化初始化 fl

6、oat getx(void) return xcoord; float gety(void) return ycoord;; point p1; point *p2=new point;11/91例:例:main() print(void) cuberoot(float x) add(int a,int b) 屬性說(shuō)明屬性說(shuō)明 類(lèi)型類(lèi)型 函數(shù)名函數(shù)名(參數(shù)表參數(shù)表);參數(shù)表參數(shù)表空空/void/ ,例:例:add(int,int) swap(float &,float &) /引用方式引用方式函數(shù)原型中的參數(shù)表可忽略參數(shù)名函數(shù)原型中的參數(shù)表可忽略參數(shù)名12/91程序中某函數(shù)的調(diào)

7、用語(yǔ)句出現(xiàn)在該函數(shù)的定程序中某函數(shù)的調(diào)用語(yǔ)句出現(xiàn)在該函數(shù)的定 義前,必須在調(diào)用語(yǔ)句之前列出函數(shù)原型;義前,必須在調(diào)用語(yǔ)句之前列出函數(shù)原型; 函數(shù)原型的使用函數(shù)原型的使用/program5_1.cpp#include#includefloat cuberoot(float);void main(void)類(lèi)定義中,較大的函數(shù)成員定義移到類(lèi)說(shuō)明類(lèi)定義中,較大的函數(shù)成員定義移到類(lèi)說(shuō)明 外,該函數(shù)的原型列于類(lèi)說(shuō)明之中。外,該函數(shù)的原型列于類(lèi)說(shuō)明之中。13/91例:例:class point / point:平面上一點(diǎn)平面上一點(diǎn)private: float xcoord,ycoord;public: v

8、oid setx(float x) xcoord=x;/初始化初始化 void sety(floaty) ycoord=y;/初始化初始化 floatgetx(void) return xcoord; floatgety(void) return ycoord;;14/91例:例:class clock /時(shí)鐘類(lèi)的定義時(shí)鐘類(lèi)的定義 public: /外部接口,公有成員函數(shù)外部接口,公有成員函數(shù) /函數(shù)原型函數(shù)原型 void settime(int newh=0, int newm=0, int news=0); private: /私有數(shù)據(jù)成員私有數(shù)據(jù)成員 int hour,minute,se

9、cond; ;void clock:settime(int newh, int newm, int news)hour=newh; minute=newm; second=news;15/91函數(shù)定義包括函數(shù)體函數(shù)定義包括函數(shù)體1.1.函數(shù)說(shuō)明函數(shù)說(shuō)明函數(shù)定義函數(shù)定義屬性說(shuō)明屬性說(shuō)明 類(lèi)型類(lèi)型 函數(shù)名函數(shù)名(參數(shù)表參數(shù)表) 函數(shù)體函數(shù)體與函數(shù)原型一致與函數(shù)原型一致不可省略不可省略參數(shù)名參數(shù)名復(fù)合語(yǔ)句復(fù)合語(yǔ)句函數(shù)定義與函數(shù)原型的主要區(qū)別函數(shù)定義與函數(shù)原型的主要區(qū)別16/91例:例:class clock /時(shí)鐘類(lèi)的定義時(shí)鐘類(lèi)的定義 public: /外部接口,公有成員函數(shù)外部接口,公有成員函數(shù)

10、void settime(int newh=0, int newm=0, int news=0); /函數(shù)原型函數(shù)原型 private: /私有數(shù)據(jù)成員私有數(shù)據(jù)成員 int hour,minute,second; ; /函數(shù)定義函數(shù)定義void clock:settime(int newh, int newm, int news)hour=newh; minute=newm; second=news; /函數(shù)體函數(shù)體 17/912.2.函數(shù)調(diào)用函數(shù)調(diào)用 函數(shù)調(diào)用的兩要素函數(shù)調(diào)用的兩要素-已定義函數(shù)的實(shí)際運(yùn)行已定義函數(shù)的實(shí)際運(yùn)行函數(shù)名函數(shù)名實(shí)參表實(shí)參表例:例:/program5_1.cpp函數(shù)的

11、調(diào)用實(shí)施過(guò)程函數(shù)的調(diào)用實(shí)施過(guò)程 xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);(1)搜索搜索同名函數(shù)同名函數(shù)定義;定義; /函數(shù)重載函數(shù)重載(2)核對(duì)實(shí)參的核對(duì)實(shí)參的參數(shù)個(gè)數(shù),類(lèi)型,順序參數(shù)個(gè)數(shù),類(lèi)型,順序,判定,判定 是否與函數(shù)定義中的形參表一致;是否與函數(shù)定義中的形參表一致;例:例:print(void)18/91/計(jì)算計(jì)算float cuberoot(float x)float root,croot;const float eps=1e-6;croot=x;do root=croot; croot=(2 *root+x/(root*root)/3; while

12、(abs(croot-root)eps);return(croot);(3)根據(jù)參數(shù)類(lèi)型根據(jù)參數(shù)類(lèi)型(值值/引用參引用參 數(shù)數(shù))進(jìn)行值參數(shù)的值傳遞進(jìn)行值參數(shù)的值傳遞/ 引用參數(shù)的換名引用參數(shù)的換名;(4)運(yùn)行函數(shù)體代碼;運(yùn)行函數(shù)體代碼;(5)返回調(diào)用點(diǎn)及函數(shù)值。返回調(diào)用點(diǎn)及函數(shù)值。3x19/91(1)把運(yùn)行控制從函數(shù)體返回到函數(shù)調(diào)用點(diǎn);把運(yùn)行控制從函數(shù)體返回到函數(shù)調(diào)用點(diǎn);(2) 返回?cái)?shù)據(jù)值。返回?cái)?shù)據(jù)值。3.3.函數(shù)的返回函數(shù)的返回函數(shù)的返回完成的任務(wù)函數(shù)的返回完成的任務(wù)例:例:void main(void).;xr=cuberoot(-q/2+a)+cuberoot(-q/2-a); floa

13、t cuberoot(float x). return(croot);20/91例:例:void print()cout“helloworld!”; void show()cout1個(gè),以結(jié)構(gòu)個(gè),以結(jié)構(gòu)/類(lèi),數(shù)組類(lèi),數(shù)組/對(duì)象對(duì)象指針類(lèi)型方式實(shí)現(xiàn)指針類(lèi)型方式實(shí)現(xiàn)例:例:int add(int a,int b);/返回返回1個(gè)值個(gè)值 22/91例:例:#includeclass complex /復(fù)數(shù)類(lèi)聲明復(fù)數(shù)類(lèi)聲明public: /外部接口外部接口 complex(double r=0.0,double i=0.0) real=r;imag=i;/構(gòu)造函數(shù)構(gòu)造函數(shù) complex operat

14、or + (complex c2);/運(yùn)算符運(yùn)算符+重載成員函數(shù)重載成員函數(shù) private: /私有數(shù)據(jù)成員私有數(shù)據(jù)成員double real; /復(fù)數(shù)實(shí)部復(fù)數(shù)實(shí)部double imag; /復(fù)數(shù)虛部復(fù)數(shù)虛部 ; complex complex:operator +(complex c2)return complex(real+c2.real, imag+c2.imag);23/91例:例:#include int & maxref(int &x, int &y) /系統(tǒng)不生成返回值的副本系統(tǒng)不生成返回值的副本if (xy) return x; return y;vo

15、id main()int a,b; coutab; coutmaxref(a,b)endl;返回引用類(lèi)型返回引用類(lèi)型24/91例:例:void print(void); int getx(); 4.4.函數(shù)的參數(shù)函數(shù)的參數(shù)無(wú)參函數(shù)無(wú)參函數(shù)-void/空:無(wú)參空:無(wú)參1/多個(gè)參數(shù)多個(gè)參數(shù)例:例: /對(duì)對(duì)n元元int型數(shù)組型數(shù)組array排序排序 void sort(int n,char *array) ; /求求3個(gè)實(shí)數(shù)個(gè)實(shí)數(shù)a,b,c中最大者中最大者 float max(flaot a,float b,float c) ;25/911/多個(gè)參數(shù)多個(gè)參數(shù)定義中注意參數(shù)表的組成。不同的函數(shù)根據(jù)定義

16、中注意參數(shù)表的組成。不同的函數(shù)根據(jù)函數(shù)名和參數(shù)表來(lái)區(qū)分,只有二者完全一致函數(shù)名和參數(shù)表來(lái)區(qū)分,只有二者完全一致才是同一函數(shù)。才是同一函數(shù)。p125例:函數(shù)重載例:函數(shù)重載 int abs(int n)return(n0?-n:n); float abs(float f)if(f0)f=-f;return f; double abs(double d)if(d0)return-d;return d;26/91不定個(gè)數(shù)參數(shù)不定個(gè)數(shù)參數(shù)-參數(shù)個(gè)數(shù)是變化的參數(shù)個(gè)數(shù)是變化的例例:設(shè)計(jì)電話計(jì)費(fèi)函數(shù),為了計(jì)算通話費(fèi),不同設(shè)計(jì)電話計(jì)費(fèi)函數(shù),為了計(jì)算通話費(fèi),不同 的通話類(lèi)型的通話類(lèi)型(市話,長(zhǎng)途,數(shù)據(jù)與通訊,市

17、話,長(zhǎng)途,數(shù)據(jù)與通訊,bp 機(jī)等機(jī)等)有不同數(shù)目的參數(shù)。有不同數(shù)目的參數(shù)。 27/91不定個(gè)數(shù)參數(shù)不定個(gè)數(shù)參數(shù)處理參數(shù)個(gè)數(shù)不定的途徑處理參數(shù)個(gè)數(shù)不定的途徑例:例:void sort(int n,float *a);例:例:int f(int a,int b) return a+b*b; int f(int a,int b,int) return a*a+b; f(x,y)調(diào)用調(diào)用f(int a,int b) f(x,y,0) f(int a,int b,int) 有的有的c+版本版本(vc6.0)提供庫(kù)函數(shù),支持提供庫(kù)函數(shù),支持void abc(int i,);為了區(qū)分函數(shù),允許參數(shù)表中包含無(wú)

18、名參數(shù)為了區(qū)分函數(shù),允許參數(shù)表中包含無(wú)名參數(shù)28/91c+允許為函數(shù)定義可缺省參數(shù)允許為函數(shù)定義可缺省參數(shù)處理參數(shù)個(gè)數(shù)不定的途徑處理參數(shù)個(gè)數(shù)不定的途徑例:例:int sqrsum(int a,int b,int c=0)/ c:可缺省參數(shù)可缺省參數(shù) return a*a+b*b+c*c; 合法的調(diào)用方式合法的調(diào)用方式: sqrsum(x,y,z); / x,y,z:int型型,c=z sqrsum(x+y,x-y); sqrsum(x,y);參數(shù)表中可有任意多個(gè)參數(shù)為可缺省參數(shù),所參數(shù)表中可有任意多個(gè)參數(shù)為可缺省參數(shù),所有可缺省參數(shù)必須列后。調(diào)用該函數(shù)時(shí),不允有可缺省參數(shù)必須列后。調(diào)用該函數(shù)時(shí)

19、,不允許部分缺省許部分缺省:省去全部缺省參數(shù)省去全部缺省參數(shù)/一個(gè)也不省。一個(gè)也不省。29/91例:例:int sqrsum(int a,int b,int c=0,int d=1) / c,d:可缺省參數(shù)可缺省參數(shù) return a*a+b*b+c*c+d; 調(diào)用方式調(diào)用方式: sqrsum(x,y,z); / ,部分缺省,部分缺省 sqrsum(x+y,x-y); / ,全部缺省,全部缺省 sqrsum(x,y,m,n); /,全部不缺省,全部不缺省30/915.5.值調(diào)用與引用調(diào)用值調(diào)用與引用調(diào)用賦值調(diào)用方式賦值調(diào)用方式 賦值形參:函數(shù)定義的參數(shù)中,除了說(shuō)明為賦值形參:函數(shù)定義的參數(shù)中,

20、除了說(shuō)明為 引用引用(&)的參數(shù)外,其余類(lèi)型的形的參數(shù)外,其余類(lèi)型的形 參都屬于賦值形參。賦值形參在參都屬于賦值形參。賦值形參在 函數(shù)的每次調(diào)用時(shí),必須為每個(gè)函數(shù)的每次調(diào)用時(shí),必須為每個(gè) 賦值形參創(chuàng)建新的參數(shù)變量。賦值形參創(chuàng)建新的參數(shù)變量。 函數(shù)調(diào)用時(shí),檢查函數(shù)名及參數(shù)表,為值函數(shù)調(diào)用時(shí),檢查函數(shù)名及參數(shù)表,為值參分配內(nèi)存,計(jì)算對(duì)應(yīng)的參分配內(nèi)存,計(jì)算對(duì)應(yīng)的實(shí)參表達(dá)式實(shí)參表達(dá)式,把計(jì)算,把計(jì)算的值賦給剛創(chuàng)建的參數(shù)變量,運(yùn)行函數(shù)體。的值賦給剛創(chuàng)建的參數(shù)變量,運(yùn)行函數(shù)體。31/91 實(shí)參表達(dá)式:函數(shù)調(diào)用語(yǔ)句中與賦值形參對(duì)應(yīng)實(shí)參表達(dá)式:函數(shù)調(diào)用語(yǔ)句中與賦值形參對(duì)應(yīng) 的實(shí)參:指定類(lèi)型的常量的實(shí)參

21、:指定類(lèi)型的常量/變量變量/表表 達(dá)式。函數(shù)調(diào)用時(shí),計(jì)算該表達(dá)達(dá)式。函數(shù)調(diào)用時(shí),計(jì)算該表達(dá) 式的值,作為初值賦給剛為賦值式的值,作為初值賦給剛為賦值 形參創(chuàng)建的參數(shù)變量。形參創(chuàng)建的參數(shù)變量。賦值調(diào)用方式賦值調(diào)用方式為賦值形參創(chuàng)建的變量局限于函數(shù)體的局部為賦值形參創(chuàng)建的變量局限于函數(shù)體的局部變量,作為該形參的實(shí)例,一旦運(yùn)行完畢,變量,作為該形參的實(shí)例,一旦運(yùn)行完畢,撤消該參數(shù)變量。撤消該參數(shù)變量。32/91例:定義函數(shù);例:定義函數(shù); int multiple3(int n) /n:賦值形參賦值形參 n=n*3; return n; 調(diào)用函數(shù)調(diào)用函數(shù)multiple3 3次:次: int n=5

22、; /n:變量變量 coutmultiple3(2)multiple3(n) multiple3(3*n)nendl;/表達(dá)式表達(dá)式 6 15 45 5執(zhí)行結(jié)果執(zhí)行結(jié)果33/91實(shí)參表達(dá)式使用只計(jì)算值的表達(dá)式實(shí)參表達(dá)式使用只計(jì)算值的表達(dá)式實(shí)參表達(dá)式實(shí)參表達(dá)式例:例:3*n,x+y,&x,multiple3(n)對(duì)可能改變變量值的表達(dá)式,注意對(duì)可能改變變量值的表達(dá)式,注意:當(dāng)當(dāng)1個(gè)函數(shù)個(gè)函數(shù) 有多個(gè)賦值形參時(shí),值傳遞過(guò)程中,多個(gè)實(shí)參有多個(gè)賦值形參時(shí),值傳遞過(guò)程中,多個(gè)實(shí)參 表達(dá)式計(jì)算的次序。表達(dá)式計(jì)算的次序。例:例:n+,m=s+m*3 realpara(n+,n-);34/91例:例:

23、void swap(int &a,int &b) /a,b:引用形參引用形參 int temp=a; a=b; b=temp;引用調(diào)用方式引用調(diào)用方式 引用形參:函數(shù)定義的參數(shù)表中,引用形參:函數(shù)定義的參數(shù)表中,& 參數(shù)名參數(shù)名函數(shù)原型:函數(shù)原型: void swap(int &a,int &b); 或或void swap(int &,int &);35/91(1)函數(shù)的調(diào)用語(yǔ)句中對(duì)應(yīng)于引用形參的實(shí)參必須是函數(shù)的調(diào)用語(yǔ)句中對(duì)應(yīng)于引用形參的實(shí)參必須是同類(lèi)型的變量,非變量的表達(dá)式則不允許;同類(lèi)型的變量,非變量的表達(dá)式則不允許;(2)參數(shù)傳遞的

24、內(nèi)容:參數(shù)傳遞的內(nèi)容:地址;地址;(3)函數(shù)體的運(yùn)行中,引用形參起函數(shù)體的運(yùn)行中,引用形參起“換名換名”作用;作用;(4)函數(shù)體運(yùn)行結(jié)束,控制轉(zhuǎn)回調(diào)用點(diǎn)時(shí),該引用形函數(shù)體運(yùn)行結(jié)束,控制轉(zhuǎn)回調(diào)用點(diǎn)時(shí),該引用形參與實(shí)參變量的對(duì)應(yīng)關(guān)系終止。但調(diào)用過(guò)程中對(duì)參與實(shí)參變量的對(duì)應(yīng)關(guān)系終止。但調(diào)用過(guò)程中對(duì)該實(shí)參變量的處理和操作的該實(shí)參變量的處理和操作的結(jié)果結(jié)果,保留下來(lái)。,保留下來(lái)。引用形參不同于賦值形參的參數(shù)傳遞機(jī)制的要點(diǎn)引用形參不同于賦值形參的參數(shù)傳遞機(jī)制的要點(diǎn)36/91例:例:void swap(int &a,int &b) /a,b:引用形參引用形參 int temp=a; a=b;

25、b=temp; 調(diào)用:調(diào)用: swap(&m,&n); / swap(&(m+2),&(n+3); / 37/91例:例:void swap(int &a,int &b) /a,b:引用形參引用形參 int temp=a; a=b; b=temp; int x=5,y=3,z=7; swap(&x,&y); /結(jié)果結(jié)果x=3,y=5 swap(&y,&z); /結(jié)果結(jié)果x=5,y=7,z=353xyab37yzab5temp733temp3538/91例:指針例:指針 void swap(int *a,int *

26、b) int temp= * a; * a= * b; * b= temp; int x=5,y=3; swap(&x,&y); /結(jié)果結(jié)果x=3,y=5 53xy&x&yab35xy&x&yab5temp5temp39/91引用調(diào)用,表面上與利用指針形參的賦值調(diào)引用調(diào)用,表面上與利用指針形參的賦值調(diào)用效果相同,實(shí)際上優(yōu)于指針用效果相同,實(shí)際上優(yōu)于指針:不需要像指針不需要像指針參數(shù)那樣通過(guò)間址訪問(wèn)。參數(shù)那樣通過(guò)間址訪問(wèn)。函數(shù)采用引用參數(shù)的情形函數(shù)采用引用參數(shù)的情形改變某些變量的值;改變某些變量的值;占內(nèi)存較多的參數(shù)占內(nèi)存較多的參數(shù)(數(shù)組,對(duì)象數(shù)組

27、,對(duì)象) 。40/91int a10=0;int b10=1;int a10=0,1,2,3,4,5,6,7,8,9;int a10;a10=0,1,2,3,4,5,6,7,8,9; /41/91char a23=a,bb;strcpy(a0,a1);couta0;42/916.6.函數(shù)的嵌套與遞歸函數(shù)的嵌套與遞歸函數(shù)嵌套函數(shù)嵌套函數(shù)的函數(shù)體中包含函數(shù)的函數(shù)體中包含1/多個(gè)函數(shù)調(diào)用語(yǔ)句多個(gè)函數(shù)調(diào)用語(yǔ)句嵌套:函數(shù)嵌套:函數(shù)a調(diào)用函數(shù)調(diào)用函數(shù)b。函數(shù)。函數(shù)b的定義的定義/原型必原型必 須出現(xiàn)在函數(shù)須出現(xiàn)在函數(shù)a的定義語(yǔ)句之前。的定義語(yǔ)句之前。 函數(shù)函數(shù)a調(diào)用函數(shù)調(diào)用函數(shù)b:調(diào)用:調(diào)用a的過(guò)程中,調(diào)

28、的過(guò)程中,調(diào) 用用b;執(zhí)行結(jié)束返回到;執(zhí)行結(jié)束返回到a的函數(shù)體中。的函數(shù)體中。43/91例:例:void main() fa(); void fa() fb(); 嵌套用嵌套用stack管理,管理,調(diào)用層次調(diào)用層次時(shí)空開(kāi)銷(xiāo)時(shí)空開(kāi)銷(xiāo)44/91函數(shù)函數(shù)的遞歸的遞歸函數(shù)其函數(shù)體中直函數(shù)其函數(shù)體中直/間接地自己調(diào)用自己間接地自己調(diào)用自己例:間接遞歸例:間接遞歸 a調(diào)用函數(shù)調(diào)用函數(shù)b,函數(shù),函數(shù)b又調(diào)用函數(shù)又調(diào)用函數(shù)a例:例:float fac(int n) /n! float f=(n2)?1 :n*fac(n-1); return f 45/9152 49 80 36 1449 49 80 36 1

29、4例:快速排序算法例:快速排序算法 int partition(int i,int j,float ai) int m=i; float c=ai; for(int k=i+1;kj;k+) if(akf) int m=patition(f,l,a); qsort(f,m,a); qsort(m,l,a); 47/91 (1)直直/間接遞歸必須保證在有限次調(diào)用后結(jié)束;間接遞歸必須保證在有限次調(diào)用后結(jié)束; (2)函數(shù)調(diào)用時(shí)系統(tǒng)付出時(shí)空間代價(jià),在機(jī)能函數(shù)調(diào)用時(shí)系統(tǒng)付出時(shí)空間代價(jià),在機(jī)能 相同的情形下,非遞歸程序效率較高。相同的情形下,非遞歸程序效率較高。48/917.7.內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)c+程序中

30、符合條件的函數(shù)程序中符合條件的函數(shù)函數(shù)說(shuō)明前:函數(shù)說(shuō)明前:inline的函數(shù);的函數(shù);類(lèi)內(nèi)定義的函數(shù)成員。類(lèi)內(nèi)定義的函數(shù)成員。inline 類(lèi)型類(lèi)型 函數(shù)名(形式參數(shù)表);函數(shù)名(形式參數(shù)表);例:例:class point float xcoord;public: void setx(float x) xcoord=x;;49/91編譯過(guò)程中,編譯過(guò)程中, inline函數(shù)的代碼插入到該函數(shù)函數(shù)的代碼插入到該函數(shù) 的各調(diào)用點(diǎn),使程序執(zhí)行中,每次該函數(shù)調(diào)的各調(diào)用點(diǎn),使程序執(zhí)行中,每次該函數(shù)調(diào) 用時(shí)不需控制轉(zhuǎn)移,但該函數(shù)代碼可能有多用時(shí)不需控制轉(zhuǎn)移,但該函數(shù)代碼可能有多 個(gè)拷貝在目標(biāo)程序中;個(gè)拷

31、貝在目標(biāo)程序中;把函數(shù)體短小而頻繁調(diào)用的函數(shù)說(shuō)明為把函數(shù)體短小而頻繁調(diào)用的函數(shù)說(shuō)明為inline 函數(shù)函數(shù);編譯預(yù)處理的宏定義方式,類(lèi)似于編譯預(yù)處理的宏定義方式,類(lèi)似于inline函數(shù)函數(shù) 的功能。的功能。 inline函數(shù)的方式更方便和可靠。函數(shù)的方式更方便和可靠。7.7.內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)50/91使用內(nèi)聯(lián)函數(shù)注意使用內(nèi)聯(lián)函數(shù)注意內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語(yǔ)句和內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語(yǔ)句和 switch語(yǔ)句;語(yǔ)句;若已在函數(shù)原型中指定若已在函數(shù)原型中指定inline,函,函 數(shù)定義時(shí)不能重復(fù)給出;數(shù)定義時(shí)不能重復(fù)給出; 遞歸函數(shù)不能被定義成遞歸函數(shù)不能被定義成“內(nèi)聯(lián)內(nèi)聯(lián)”函數(shù)。函數(shù)。51/91例

32、:例:#include #include inline int isnumber(char); void main() char c; int n; n=0; while(c=getchar()!=n) if (isnumber(c) n+; int isnumber(char ch)return(ch=0 & ch=9)?1:0; 52/915.3 函數(shù)與運(yùn)算符的重載函數(shù)與運(yùn)算符的重載1.1. 重載重載-同名不同義,不同情況下表現(xiàn)出不同同名不同義,不同情況下表現(xiàn)出不同“行為行為”, 面向?qū)ο笙到y(tǒng)的面向?qū)ο笙到y(tǒng)的3 3大特性之一的大特性之一的多態(tài)性多態(tài)性通過(guò)通過(guò)重重 載載實(shí)現(xiàn)實(shí)現(xiàn)函數(shù)重

33、載:多個(gè)函數(shù)同名,但執(zhí)行的操作和函數(shù)重載:多個(gè)函數(shù)同名,但執(zhí)行的操作和 操作對(duì)象不同操作對(duì)象不同操作符重載:一個(gè)運(yùn)算符,可進(jìn)行多種不同操作符重載:一個(gè)運(yùn)算符,可進(jìn)行多種不同 含義的解釋?zhuān)M(jìn)行不同操作含義的解釋?zhuān)M(jìn)行不同操作 重載重載53/91例:比較大?。豪罕容^大?。? 2個(gè)整數(shù)比較、個(gè)整數(shù)比較、2 2個(gè)浮點(diǎn)數(shù)比個(gè)浮點(diǎn)數(shù)比 較、較、. . 在在c+ c+ 中必須逐個(gè)定義不同名的多個(gè)函數(shù)中必須逐個(gè)定義不同名的多個(gè)函數(shù) 目標(biāo):系統(tǒng)自動(dòng)判斷,用戶只要記住函數(shù)目標(biāo):系統(tǒng)自動(dòng)判斷,用戶只要記住函數(shù) 名即可名即可 重載:寫(xiě)多個(gè)同名函數(shù),由系統(tǒng)根據(jù)操作重載:寫(xiě)多個(gè)同名函數(shù),由系統(tǒng)根據(jù)操作 數(shù)自動(dòng)判斷調(diào)用哪

34、個(gè)函數(shù)數(shù)自動(dòng)判斷調(diào)用哪個(gè)函數(shù)54/912.2.函數(shù)(名)重載函數(shù)(名)重載-為了方便程序員的使用,為了方便程序員的使用,多個(gè)不同的函數(shù)采多個(gè)不同的函數(shù)采 用同一名字用同一名字例:例:int abs(int n)return(n0?-n:n); float abs(float f)if(f0)f=-f;return f; double abs(double d)if(d0)return-d;return d;不同的數(shù)據(jù)類(lèi)型求和,數(shù)據(jù)的差別很大不同的數(shù)據(jù)類(lèi)型求和,數(shù)據(jù)的差別很大(整數(shù)整數(shù)/向量向量/矩陣矩陣),求和操作差別也大,但完成不,求和操作差別也大,但完成不同求和操作的函數(shù)可以取相同名字同求

35、和操作的函數(shù)可以取相同名字55/91例:例: int abs(int n)return(n0?-n:n);float abs(float f)if(f=2個(gè)個(gè) 同名函數(shù)與之匹配;找不到與之同名函數(shù)與之匹配;找不到與之 匹配的函數(shù)定義。匹配的函數(shù)定義。60/91定義同名函數(shù)時(shí)注意定義同名函數(shù)時(shí)注意(4)包含可缺省參數(shù)時(shí),可能造成二義性包含可缺省參數(shù)時(shí),可能造成二義性例:例:int sum (int a,int b,int c=0); int sum(int a,int b); 調(diào)用:調(diào)用:sum(5,3); /二義性二義性a.尋找尋找1個(gè)完全匹配,找到就調(diào)用個(gè)完全匹配,找到就調(diào)用 b.通過(guò)內(nèi)部轉(zhuǎn)

36、換尋找通過(guò)內(nèi)部轉(zhuǎn)換尋找1個(gè)匹配,找到就調(diào)用個(gè)匹配,找到就調(diào)用 c.通過(guò)用戶自己定義的轉(zhuǎn)換尋找通過(guò)用戶自己定義的轉(zhuǎn)換尋找1個(gè)匹配,找到個(gè)匹配,找到 就調(diào)用就調(diào)用 匹配重載函數(shù)的順序匹配重載函數(shù)的順序 61/91無(wú)準(zhǔn)確匹配的函數(shù)定義時(shí)的處理方式無(wú)準(zhǔn)確匹配的函數(shù)定義時(shí)的處理方式(1)數(shù)組名數(shù)組名-指針變量,函數(shù)名指針變量,函數(shù)名-函數(shù)指針,某類(lèi)函數(shù)指針,某類(lèi) 型變量型變量-const常量的轉(zhuǎn)換,實(shí)現(xiàn)匹配常量的轉(zhuǎn)換,實(shí)現(xiàn)匹配? (2)實(shí)參類(lèi)型實(shí)參類(lèi)型:低低高高(字長(zhǎng)字長(zhǎng):短短長(zhǎng)長(zhǎng))進(jìn)行基本類(lèi)型進(jìn)行基本類(lèi)型 -派生類(lèi)型的轉(zhuǎn)換,可匹配派生類(lèi)型的轉(zhuǎn)換,可匹配?(3)有無(wú)可變個(gè)數(shù)參數(shù)的函數(shù),如有把它歸為該有無(wú)

37、可變個(gè)數(shù)參數(shù)的函數(shù),如有把它歸為該 函數(shù)。函數(shù)。 上述嘗試性處理后可能出現(xiàn)仍無(wú)匹配上述嘗試性處理后可能出現(xiàn)仍無(wú)匹配/匹配不唯匹配不唯 一,可能輸出出錯(cuò)信息一,可能輸出出錯(cuò)信息/錯(cuò)誤運(yùn)行。錯(cuò)誤運(yùn)行。定義同名函數(shù)時(shí)注意定義同名函數(shù)時(shí)注意62/91(4)同名函數(shù)應(yīng)具有相同的功能同名函數(shù)應(yīng)具有相同的功能 定義同名函數(shù)時(shí)注意定義同名函數(shù)時(shí)注意例:例:#includeiostream#include .h intint add( add(intint x, x,intint y) y) coutint,int coutint,int: ; return x+y; : ; return x+y; doubl

38、e add(double add(doubledouble x, x,doubledouble y) y) cout coutdouble,double: ; return x+y; double,double: ; return x+y; intint add( add(intint x, x,doubledouble y) y) coutint,double: ; return int coutint,double: ; return int(x+y); (x+y); double add(double add(doubledouble x, x,intint y) y) coutdoub

39、le,int coutdouble,int: ; return x+y; : ; return x+y; 63/91void main() void main() coutadd(99,88)endl; coutadd(99,88)endl; coutadd(99.9,88.8)endl; coutadd(99.9,88.8)endl; coutadd(99,88.8)endl; coutadd(99,88.8)endl; coutadd(99.9,88)endl coutadd(99.9,88)endl; ; 64/913.3.運(yùn)算符重載的需要性運(yùn)算符重載的需要性問(wèn)題的提出:?jiǎn)栴}的提出:c+

40、c+中,定義一個(gè)類(lèi)就產(chǎn)生一個(gè)新類(lèi)型,類(lèi)的中,定義一個(gè)類(lèi)就產(chǎn)生一個(gè)新類(lèi)型,類(lèi)的對(duì)象和變量一樣可以作為參數(shù)傳遞對(duì)象和變量一樣可以作為參數(shù)傳遞/ /函數(shù)的返回類(lèi)型函數(shù)的返回類(lèi)型 希望某些運(yùn)算符能對(duì)整個(gè)對(duì)象操作,而不是希望某些運(yùn)算符能對(duì)整個(gè)對(duì)象操作,而不是c c的簡(jiǎn)單操作的簡(jiǎn)單操作 例:例:+ + 運(yùn)算符能夠?qū)崿F(xiàn)運(yùn)算符能夠?qū)崿F(xiàn)2 2個(gè)對(duì)象間的加個(gè)對(duì)象間的加 把某些事交給系統(tǒng)去做,用戶只要知道相加就可把某些事交給系統(tǒng)去做,用戶只要知道相加就可 提出運(yùn)算符重載,擴(kuò)充運(yùn)算符的功能。即:對(duì)運(yùn)算符進(jìn)提出運(yùn)算符重載,擴(kuò)充運(yùn)算符的功能。即:對(duì)運(yùn)算符進(jìn) 行重載定義,然后使用,由系統(tǒng)自動(dòng)判斷采用哪個(gè)具體行重載定義,然后

41、使用,由系統(tǒng)自動(dòng)判斷采用哪個(gè)具體 的運(yùn)算符的運(yùn)算符 c+ c+ 語(yǔ)言的可擴(kuò)充性語(yǔ)言的可擴(kuò)充性65/91例:類(lèi)例:類(lèi)a a的對(duì)象的對(duì)象a1a1、a2a2、a3a3,希望:,希望:a3 = a1 + a2a3 = a1 + a2; 分別把對(duì)象分別把對(duì)象a1a1和和a2a2的各個(gè)數(shù)據(jù)成員值對(duì)應(yīng)相加,的各個(gè)數(shù)據(jù)成員值對(duì)應(yīng)相加, 然后賦給對(duì)象然后賦給對(duì)象a3 a3 實(shí)現(xiàn)途徑:對(duì)運(yùn)算符進(jìn)行重載實(shí)現(xiàn)途徑:對(duì)運(yùn)算符進(jìn)行重載66/914.4.可重載運(yùn)算符可重載運(yùn)算符p127限定符限定符 , :條件運(yùn)算符條件運(yùn)算符 ?:取長(zhǎng)度運(yùn)算符取長(zhǎng)度運(yùn)算符sizeof不可重載的運(yùn)算符不可重載的運(yùn)算符可重載的運(yùn)算符中的情況可重

42、載的運(yùn)算符中的情況1)算術(shù)算術(shù)/邏輯邏輯/位運(yùn)算符和關(guān)系運(yùn)算符中的位運(yùn)算符和關(guān)系運(yùn)算符中的, =,與基本數(shù)據(jù)類(lèi)型有關(guān),通過(guò)重載,與基本數(shù)據(jù)類(lèi)型有關(guān),通過(guò)重載, 使之用于用戶定義的數(shù)據(jù)類(lèi)型;使之用于用戶定義的數(shù)據(jù)類(lèi)型;67/91可重載的運(yùn)算符中的情況可重載的運(yùn)算符中的情況2)賦值運(yùn)算符賦值運(yùn)算符=,關(guān)系運(yùn)算符,關(guān)系運(yùn)算符=,!=,指針運(yùn)算,指針運(yùn)算 符符&和和*,下標(biāo)運(yùn)算符,下標(biāo)運(yùn)算符,涉及的數(shù)據(jù)類(lèi)型按,涉及的數(shù)據(jù)類(lèi)型按 c+規(guī)定,不限于基本數(shù)值類(lèi)型,規(guī)定,不限于基本數(shù)值類(lèi)型,“自動(dòng)自動(dòng)”重載;重載;3)+/-可作為前可作為前/后綴:后綴: 后綴后綴+的重載函數(shù)的原型參數(shù)表中增加的重載函

43、數(shù)的原型參數(shù)表中增加int型的型的 無(wú)名參數(shù)。無(wú)名參數(shù)。前前綴綴+operator+() /作為類(lèi)成員作為類(lèi)成員 operator+() /作為類(lèi)外函數(shù)作為類(lèi)外函數(shù)后后綴綴+operator+(int) /作為類(lèi)成員作為類(lèi)成員 operator+(,int) /作為類(lèi)外函數(shù)作為類(lèi)外函數(shù)68/91前前綴綴+ +a或或a.operator+() operator+(a)后后綴綴+ a+或或a.operator+(0) operator+(a,0)調(diào)用調(diào)用:前前綴綴+operator+() /作為類(lèi)成員作為類(lèi)成員 operator+() /作為類(lèi)外函數(shù)作為類(lèi)外函數(shù)后后綴綴+operator+(int

44、) /作為類(lèi)成員作為類(lèi)成員 operator+(,int) /作為類(lèi)外函數(shù)作為類(lèi)外函數(shù)69/91例:例:# #include iostreaminclude .hclass increaseclass increasepublic:public: increase(int increase(int x):value(x) x):value(x) friend increase & operator+(increase&); / friend increase & operator+(increase&); /前增量前增量 friend increase oper

45、ator+(increase&friend increase operator+(increase&,intint); /); /后增量后增量 void display() cout the value is value endlvoid display() cout the value is value endl; ; private:private: int int value; value;increase & increase:operator+(increase& a)increase & increase:operator+(increase

46、& a) a.value+; / a.value+; /先增量先增量 return a; /return a; /再返回原對(duì)象再返回原對(duì)象 increase increase:operator+(increase& a ,intincrease increase:operator+(increase& a ,int) ) increase temp(a); / increase temp(a); /通過(guò)拷貝構(gòu)造函數(shù)保存原有對(duì)象值通過(guò)拷貝構(gòu)造函數(shù)保存原有對(duì)象值 a.value+; /a.value+; /原有對(duì)象增量修改原有對(duì)象增量修改 return temp; /ret

47、urn temp; /返回原有對(duì)象值返回原有對(duì)象值 70/915.5.運(yùn)算符重載函數(shù)的定義運(yùn)算符重載函數(shù)的定義 operator函數(shù)名函數(shù)名例:前綴例:前綴 operator+() operator+()71/91#include class numberint x;public:number()x=0;number(int i)x=i;void disp()coutx=xendl;void operator+()x+; /前置運(yùn)算符前置運(yùn)算符void operator+(int)x+=2; /后置運(yùn)算符后置運(yùn)算符;72/91void main()number obj(5); obj.disp

48、(); +obj; /調(diào)用前置運(yùn)算符調(diào)用前置運(yùn)算符 obj.disp(); obj+; /調(diào)用后置運(yùn)算符調(diào)用后置運(yùn)算符 obj.disp();73/91#include class vectorint x,y;public:vector();vector(int i,int j)x=i;y=j;void disp()cout(x,y)endl;void operator+=(vector d)x+=d.x;y+=d.y; void operator-=(vector d)x-=d.x;y-=d.y;74/91void main()vector a(1,2),b(4,2); couta:; a.

49、disp(); coutb:; b.disp(); a+=b; couta+=b:; a.disp(); a-=b; couta-=b:; a.disp();75/91例:例:#include enum newboolfalse,true; newbool operator+(newbool a,newbool b)if(a=false)&(b=false)return false;return true;newbool operator*(newbool a,newbool b)if(a=true)&(b=true)return true;return false;newbool operator-(newbool a) if(a=false)return true; return false;76/91main()newbool b1=true,b2=false,b3=true;

溫馨提示

  • 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)論