函数与运算符的重载PPT学习教案_第1页
函数与运算符的重载PPT学习教案_第2页
函数与运算符的重载PPT学习教案_第3页
函数与运算符的重载PPT学习教案_第4页
函数与运算符的重载PPT学习教案_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1函数与运算符的重载函数与运算符的重载2/91函数在C+中的意义第1页/共91页3/915.1 3次方程求根程序的设计332332)3()2(2)3()2(2pqqpqqxr 方法:(1)计算浮点数的立方根的程序作为函数 (2)主程序中2次调用该函数 (3) 计算 迭代公式:rn+1=2/3*rn+y/(3rn2)3y第2页/共91页4/91#include#includefloat cuberoot(float); /原型void main(void)float p,q,xr;coutpq;float a=sqrt(q/2*q/2+p/3*p/3*p/3); /xr=cuberoot(

2、-q/2+a)+cuberoot(-q/2-a);coutendlThe real root of the equation is eps);return(croot);3x第4页/共91页6/91执行结果第5页/共91页7/915.2 函数的说明与使用1.函数说明 函数原型/声明-指出函数的名称,类型和参数例:int add(int a,int b); inline void swap(float&,float&); void print(char *);可省略第6页/共91页8/91 属性说明 类型 函数名(参数表);可缺省属性说明函数的返回类型标识符除main()函数和类

3、的构造/析构函数之外,所有函数必须指出返回类型第7页/共91页9/91例:/program 7_1.cppclass stack float datamaxsize; int top;public: stack(void); /构造函数 P168 stack(void); /析构函数 P169 ;stack:stack(void) top=0; coutstack initialized.endl;第8页/共91页10/91例:class point / point:平面上一点private: float Xcoord,Ycoord;public: void SetX(float x) Xco

4、ord=x;/初始化 void SetY(floaty) Ycoord=y;/初始化 float GetX(void) return Xcoord; float GetY(void) return Ycoord;; point p1; point *p2=new point;第9页/共91页11/91 属性说明 类型 函数名(参数表);参数表空/void/ ,例:add(int,int) swap(float &,float &) /引用方式函数原型中的参数表可忽略参数名第10页/共91页12/91函数原型的使用/program5_1.cpp#include#includefl

5、oat cuberoot(float);void main(void)类定义中,较大的函数成员定义移到类说明 外,该函数的原型列于类说明之中。第11页/共91页13/91例:class point / point:平面上一点private: float Xcoord,Ycoord;public: void SetX(float x) Xcoord=x;/初始化 void SetY(floaty) Ycoord=y;/初始化 floatGetX(void) return Xcoord; floatGetY(void) return Ycoord;;第12页/共91页14/91例:class Cl

6、ock /时钟类的定义 public: /外部接口,公有成员函数 /函数原型 void SetTime(int NewH=0, int NewM=0, int NewS=0); private: /私有数据成员 int Hour,Minute,Second; ;void Clock:SetTime(int NewH, int NewM, int NewS)Hour=NewH; Minute=NewM; Second=NewS;第13页/共91页15/911.函数说明 函数定义属性说明 类型 函数名(参数表) 函数体与函数原型一致不可省略参数名复合语句函数定义与函数原型的主要区别第14页/共91

7、页16/91例:class Clock /时钟类的定义 public: /外部接口,公有成员函数 void SetTime(int NewH=0, int NewM=0, int NewS=0); /函数原型 private: /私有数据成员 int Hour,Minute,Second; ; /函数定义void Clock:SetTime(int NewH, int NewM, int NewS)Hour=NewH; Minute=NewM; Second=NewS; /函数体 第15页/共91页17/912.函数调用 函数调用的两要素-已定义函数的实际运行函数名实参表例:/program5

8、_1.cpp函数的调用实施过程 xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);例:print(void)第16页/共91页18/91/计算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(abs(croot-root)eps);return(croot);(3)根据参数类型(值/引用参 数)进行值参数的值传递/ 引用参数的换名;(4)运行函数体代码;(5)返回调用点及函数值。

9、3x第17页/共91页19/913.函数的返回 函数的返回完成的任务例:void main(void).;xr=cuberoot(-q/2+a)+cuberoot(-q/2-a); float cuberoot(float x). return(croot);第18页/共91页20/91 函数的返回值返回void类型-函数无值返回未作类型说明的函数,返回int型值返回数值类型例:add(int a,int b); /返回int型值 int add(int a,int b);/返回1个值 float cuberoot(float x);第19页/共91页21/91 函数的返回值返回数值类型函数返

10、回的数值1个,以结构/类,数组/对象指针类型方式实现例:int add(int a,int b);/返回1个值 第20页/共91页22/91例:#includeclass complex /复数类声明public: /外部接口 complex(double r=0.0,double i=0.0) real=r;imag=i;/构造函数 complex operator + (complex c2);/运算符+重载成员函数 private: /私有数据成员double real; /复数实部double imag; /复数虚部 ; complex complex:operator +(compl

11、ex c2)return complex(real+c2.real, imag+c2.imag);第21页/共91页23/91例:#include int & maxRef(int &x, int &y) /系统不生成返回值的副本if (xy) return x; return y;void main()int a,b; coutab; coutmaxRef(a,b)endl;返回引用类型第22页/共91页24/914.函数的参数 无参函数-void/空:无参 1/多个参数例: /对n元int型数组array排序 void sort(int n,char *array)

12、 ; /求3个实数a,b,c中最大者 float max(flaot a,float b,float c) ;第23页/共91页25/91 1/多个参数定义中注意参数表的组成。不同的函数根据函数名和参数表来区分,只有二者完全一致才是同一函数。P125例:函数重载 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;第24页/共91页26/91 不定个数参数-参数个数是变化的例:设计电话计费函数,为了计算通话费,不同 的通

13、话类型(市话,长途,数据与通讯,BP 机等)有不同数目的参数。 第25页/共91页27/91 不定个数参数处理参数个数不定的途径例:void sort(int n,float *a);有的C+版本(VC6.0)提供库函数,支持void abc(int i,);为了区分函数,允许参数表中包含无名参数第26页/共91页28/91C+允许为函数定义可缺省参数处理参数个数不定的途径参数表中可有任意多个参数为可缺省参数,所有可缺省参数必须列后。调用该函数时,不允许部分缺省:省去全部缺省参数/一个也不省。第27页/共91页29/91例:int sqrsum(int a,int b,int c=0,int

14、d=1) / c,d:可缺省参数 return a*a+b*b+c*c+d; 调用方式: sqrsum(x,y,z); / ,部分缺省 sqrsum(x+y,x-y); / ,全部缺省 sqrsum(x,y,m,n); /,全部不缺省第28页/共91页30/915.值调用与引用调用 赋值调用方式 函数调用时,检查函数名及参数表,为值参分配内存,计算对应的实参表达式,把计算的值赋给刚创建的参数变量,运行函数体。第29页/共91页31/91 赋值调用方式为赋值形参创建的变量局限于函数体的局部变量,作为该形参的实例,一旦运行完毕,撤消该参数变量。第30页/共91页32/91 6 15 45 5执行结

15、果第31页/共91页33/91实参表达式使用只计算值的表达式实参表达式例:3*n,x+y,&x,multiple3(n)对可能改变变量值的表达式,注意:当1个函数 有多个赋值形参时,值传递过程中,多个实参 表达式计算的次序。例:n+,m=s+m*3 realpara(n+,n-);第32页/共91页34/91 引用调用方式引用形参:函数定义的参数表中,& 参数名函数原型: void swap(int &a,int &b); 或void swap(int &,int &);第33页/共91页35/91引用形参不同于赋值形参的参数传递机制的要点第34

16、页/共91页36/91例:void swap(int &a,int &b) /a,b:引用形参 int temp=a; a=b; b=temp; 调用: swap(&m,&n); / swap(&(m+2),&(n+3); / 第35页/共91页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); /结果x=3,y=5 swap(&y,&z); /结果x=5,y

17、=7,z=353xyab37yzab5temp733temp35第36页/共91页38/91例:指针 void swap(int *a,int * b) int temp= * a; * a= * b; * b= temp; int x=5,y=3; swap(&x,&y); /结果x=3,y=5 53xy&x&yab35xy&x&yab5temp5temp第37页/共91页39/91引用调用,表面上与利用指针形参的赋值调用效果相同,实际上优于指针:不需要像指针参数那样通过间址访问。函数采用引用参数的情形改变某些变量的值;占内存较多的参数(数组,

18、对象) 。第38页/共91页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; /第39页/共91页41/91char a23=a,bb;strcpy(a0,a1);couta0;第40页/共91页42/916.函数的嵌套与递归 函数嵌套函数的函数体中包含1/多个函数调用语句嵌套:函数A调用函数B。函数B的定义/原型必 须出现在函数A的定义语句之前。 函数A调用函数B:调用A的过程中,调 用B;执行结束返回到A的函数体中。第41页/共91页43/91例:void main()

19、 fa(); void fa() fb(); 嵌套用stack管理,调用层次时空开销第42页/共91页44/91 函数的递归函数其函数体中直/间接地自己调用自己例:间接递归 A调用函数B,函数B又调用函数A例:float fac(int n) /n! float f=(nf) int m=patition(f,l,a); Qsort(f,m,a); Qsort(m,l,a); 第45页/共91页47/91 (1)直/间接递归必须保证在有限次调用后结束; (2)函数调用时系统付出时空间代价,在机能 相同的情形下,非递归程序效率较高。第46页/共91页48/917.内联函数 C+程序中符合条件的函

20、数函数说明前:inline的函数;类内定义的函数成员。inline 类型 函数名(形式参数表);例:class point float Xcoord;public: void SetX(float x) Xcoord=x;;第47页/共91页49/91编译过程中, inline函数的代码插入到该函数 的各调用点,使程序执行中,每次该函数调 用时不需控制转移,但该函数代码可能有多 个拷贝在目标程序中;把函数体短小而频繁调用的函数说明为inline 函数;编译预处理的宏定义方式,类似于inline函数 的功能。 inline函数的方式更方便和可靠。7.内联函数第48页/共91页50/91 使用内联

21、函数注意内联函数体内不能有循环语句和 switch语句;若已在函数原型中指定inline,函 数定义时不能重复给出; 递归函数不能被定义成“内联”函数。第49页/共91页51/91例:#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; 第50页/共91页52/915.3 函数与运算符的重载1. 重载-同名不同义,

22、不同情况下表现出不同“行为”, 面向对象系统的3大特性之一的多态性通过重 载实现函数重载:多个函数同名,但执行的操作和 操作对象不同操作符重载:一个运算符,可进行多种不同 含义的解释,进行不同操作 重载第51页/共91页53/91例:比较大小:2个整数比较、2个浮点数比 较、. 在C+ 中必须逐个定义不同名的多个函数 目标:系统自动判断,用户只要记住函数 名即可 重载:写多个同名函数,由系统根据操作 数自动判断调用哪个函数第52页/共91页54/912.函数(名)重载-为了方便程序员的使用,多个不同的函数采 用同一名字例:int abs(int n)return(n0?-n:n); float

23、 abs(float f)if(f0)f=-f;return f; double abs(double d)if(d0)return-d;return d;不同的数据类型求和,数据的差别很大(整数/向量/矩阵),求和操作差别也大,但完成不同求和操作的函数可以取相同名字第53页/共91页55/91例: int abs(int n)return(n0?-n:n);float abs(float f)if(f=2个 同名函数与之匹配;找不到与之 匹配的函数定义。第58页/共91页60/91 定义同名函数时注意(4)包含可缺省参数时,可能造成二义性例:int sum (int a,int b,int

24、c=0); int sum(int a,int b); 调用:sum(5,3); /二义性a.寻找1个完全匹配,找到就调用 b.通过内部转换寻找1个匹配,找到就调用 c.通过用户自己定义的转换寻找1个匹配,找到 就调用 匹配重载函数的顺序 第59页/共91页61/91 无准确匹配的函数定义时的处理方式(1)数组名-指针变量,函数名-函数指针,某类 型变量-const常量的转换,实现匹配? (2)实参类型:低高(字长:短长)进行基本类型 -派生类型的转换,可匹配?(3)有无可变个数参数的函数,如有把它归为该 函数。 上述尝试性处理后可能出现仍无匹配/匹配不唯 一,可能输出出错信息/错误运行。 定

25、义同名函数时注意第60页/共91页62/91(4)同名函数应具有相同的功能 定义同名函数时注意例:#include int add(int x,int y) coutint,int: ; return x+y; double add(double x,double y) coutdouble,double: ; return x+y; int add(int x,double y) coutint,double: ; return int(x+y); double add(double x,int y) coutdouble,int: ; return x+y; 第61页/共91页63/91v

26、oid main() coutadd(99,88)endl; coutadd(99.9,88.8)endl; coutadd(99,88.8)endl; coutadd(99.9,88)endl; 第62页/共91页64/913.运算符重载的需要性问题的提出:C+中,定义一个类就产生一个新类型,类的对象和变量一样可以作为参数传递/函数的返回类型 希望某些运算符能对整个对象操作,而不是C的简单操作 例:+ 运算符能够实现2个对象间的加 把某些事交给系统去做,用户只要知道相加就可 提出运算符重载,扩充运算符的功能。即:对运算符进 行重载定义,然后使用,由系统自动判断采用哪个具体 的运算符 C+ 语

27、言的可扩充性第63页/共91页65/91例:类A的对象a1、a2、a3,希望:a3 = a1 + a2; 分别把对象a1和a2的各个数据成员值对应相加, 然后赋给对象a3 实现途径:对运算符进行重载第64页/共91页66/914.可重载运算符P127限定符 , :条件运算符 ?:取长度运算符sizeof不可重载的运算符可重载的运算符中的情况1)算术/逻辑/位运算符和关系运算符中的, =,与基本数据类型有关,通过重载, 使之用于用户定义的数据类型;第65页/共91页67/91可重载的运算符中的情况2)赋值运算符=,关系运算符=,!=,指针运算 符&和*,下标运算符,涉及的数据类型按 C+

28、规定,不限于基本数值类型,“自动”重载;3)+/-可作为前/后缀: 后缀+的重载函数的原型参数表中增加int型的 无名参数。前缀+operator+() /作为类成员 operator+() /作为类外函数后缀+operator+(int) /作为类成员 operator+(,int) /作为类外函数第66页/共91页68/91前缀+ +a或a.operator+() operator+(a)后缀+ a+或a.operator+(0) operator+(a,0)调用:前缀+operator+() /作为类成员 operator+() /作为类外函数后缀+operator+(int) /作为类

29、成员 operator+(,int) /作为类外函数第67页/共91页69/91例:#include class Increasepublic: Increase(int x):value(x) friend Increase & operator+(Increase&); /前增量 friend Increase operator+(Increase&,int); /后增量 void display() cout the value is value endl; private: int value;Increase & Increase:operator+(

30、Increase& a) a.value+; /先增量 return a; /再返回原对象Increase Increase:operator+(Increase& a ,int) Increase temp(a); /通过拷贝构造函数保存原有对象值 a.value+; /原有对象增量修改 return temp; /返回原有对象值第68页/共91页70/915.运算符重载函数的定义 operator函数名例:前缀 operator+() operator+()第69页/共91页71/91#include class Numberint x;public:Number()x=0

31、;Number(int i)x=i;void disp()coutx=xendl;void operator+()x+; /前置运算符void operator+(int)x+=2; /后置运算符;第70页/共91页72/91void main()Number obj(5); obj.disp(); +obj; /调用前置运算符 obj.disp(); obj+; /调用后置运算符 obj.disp();第71页/共91页73/91#include class vectorint x,y;public:vector();vector(int i,int j)x=i;y=j;void disp(

32、)cout(x,y)endl;void operator+=(vector D)x+=D.x;y+=D.y;void operator-=(vector D)x-=D.x;y-=D.y;第72页/共91页74/91void main()vector A(1,2),B(4,2); coutA:; A.disp(); coutB:; B.disp(); A+=B; coutA+=B:; A.disp(); A-=B; coutA-=B:; A.disp();第73页/共91页75/91例:#include enum newboolFalse,True; newbool operator+(newb

33、ool 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;第74页/共91页76/91main()newbool b1=True,b2=False,b3=True; b1=b1+b2; coutb1endl; b1=ope

34、rator+(b1,b2); /b1= b1 +b2; coutb1endl; b1=operator-(b3); coutb1endl; b1=(b1+b3)*False; coutb1endl;第75页/共91页77/91 输出结果第76页/共91页78/91运算符重载函数的调用(1)与原运算符相同的调用方式(2)一般函数调用方式 例:b1=b1+b2; 例:b1=operator+(b1,b2);第77页/共91页79/915.4 程序实例1.“三色冰激凌”程序 28种颜色的原料,组合成多少种三色冰激淋:1)P283=28*27*26种; 2) C283=P283/3!种。 元素数:28,选择数:3。第78页/共91页80/91/program 5_2.cpp #include long factorial(int number); void main(void) int i,selecti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论