《函数与运算符的重》PPT课件.ppt_第1页
《函数与运算符的重》PPT课件.ppt_第2页
《函数与运算符的重》PPT课件.ppt_第3页
《函数与运算符的重》PPT课件.ppt_第4页
《函数与运算符的重》PPT课件.ppt_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

第5章 函数,函数与运算符的重载 要点 函数 函数的重载 运算符的重载 1 n函数:参数化的子程序; n从SP的观点,函数:程序长度; 整个程序子任务; n从运算的角度,函数:C+提供的用户定义 的运算。运算符:系统提供的运算 ; n作为OOP的C+,类:核心,类=数据+方法 , 方法/类的函数成员:对数据的运算和处理。 函数在C+中的意义 2 例:按照Cardan公式,计算3次方程x3+px+q=0 的一个实根: 5.1 3次方程求根程序的设计 方法:(1)计算浮点数的立方根的程序作为函数 (2)主程序中2次调用该函数 (3) 计算 迭代公式:rn+1=2/3*rn+y/(3rn2) 3 #include #include float 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(-q/2+a)+cuberoot(-q/2-a); couteps); return(croot); 5 执行结果 6 属性说明 类型 函数名 (参数表); 5.2 函数的说明与使用 1.函数说明 函数原型/声明 -指出函数的名称,类型和参数 例:int add(int a,int b); inline void swap(float int top; public: stack(void); /构造函数 P168 stack(void); /析构函数 P169 ; stack:stack(void) top=0; cout , 例:add(int,int) swap(float void main(void) 类定义中,较大的函数成员定义移到类说明 外,该函数的原型列于类说明之中。 12 例: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; ; 13 例: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; 14 函数定义包括函数体 1.函数说明 函数定义 属性说明 类型 函数名(参数表) 函数体 与函数原型一致 不可省略 参数名 复合语句 函数定义与函数原型的主要区别 15 例: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; /函数体 16 2.函数调用 函数调用的两要素 -已定义函数的实际运行 函数名 实参表 例:/program5_1.cpp函数的调用实施过程 xr=cuberoot(-q/2+a)+cuberoot(-q/2-a); (1)搜索同名函数定义; /函数重载 (2)核对实参的参数个数,类型,顺序,判定 是否与函数定义中的形参表一致; 例:print(void) 17 /计算 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)返回调用点及函数值。 18 (1)把运行控制从函数体返回到函数调用点; (2) 返回数据值。 3.函数的返回 函数的返回完成的任务 例:void main(void) ; xr=cuberoot(-q/2+a)+cuberoot(-q/2-a); float cuberoot(float x) . return(croot); 19 例:void print()cout1个,以结构/类,数组/对象 指针类型方式实现 例:int add(int a,int b);/返回1个值 21 例:#include class 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 +(complex c2) return complex(real+c2.real, imag+c2.imag); 22 例:#include int return y; void main() int a,b; coutab; coutf) int m=patition(f,l,a); Qsort(f,m,a); Qsort(m,l,a); 46 (1)直/间接递归必须保证在有限次调用后结束; (2)函数调用时系统付出时空间代价,在机能 相同的情形下,非递归程序效率较高。 47 7.内联函数 C+程序中符合条件的函数 函数说明前:inline的函数; 类内定义的函数成员。 inline 类型 函数名(形式参数表); 例:class point float Xcoord; public: void SetX(float x) Xcoord=x; ; 48 编译过程中, inline函数的代码插入到该函数 的各调用点,使程序执行中,每次该函数调 用时不需控制转移,但该函数代码可能有多 个拷贝在目标程序中; 把函数体短小而频繁调用的函数说明为inline 函数; 编译预处理的宏定义方式,类似于inline函数 的功能。 inline函数的方式更方便和可靠。 7.内联函数 49 使用内联函数注意 内联函数体内不能有循环语句和 switch语句; 若已在函数原型中指定inline,函 数定义时不能重复给出; 递归函数不能被定义成“内联”函数。 50 例:#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 /二义性 a.寻找1个完全匹配,找到就调用 b.通过内部转换寻找1个匹配,找到就调用 c.通过用户自己定义的转换寻找1个匹配,找到 就调用 匹配重载函数的顺序 60 无准确匹配的函数定义时的处理方式 (1)数组名-指针变量,函数名-函数指针,某类 型变量-const常量的转换,实现匹配? (2)实参类型:低高(字长:短长)进行基本类型 -派生类型的转换,可匹配? (3)有无可变个数参数的函数,如有把它归为该 函数。 上述尝试性处理后可能出现仍无匹配/匹配不唯 一,可能输出出错信息/错误运行。 定义同名函数时注意 61 (4)同名函数应具有相同的功能 定义同名函数时注意 例:#include int add(int x,int y) cout, =,与基本数据类型有关,通过重载, 使之用于用户定义的数据类型; 66 可重载的运算符中的情况 2)赋值运算符=,关系运算符=,!=,指针运算 符 /前增量 friend Increase operator+(Increase /后增量 void display() cout operator 函数名 例:前缀 operator+() operator+() 70 #include class Number int x; public: Number()x=0; Number(int i)x=i; void disp()cout class vector int x,y; public: vector(); vector(int i,int j)x=i;y=j; void disp() cout enum newboolFalse,True; newbool operator+(newbool a,newbool b) if(a=False) return True; newbool operator*(newbool a,newbool b) if(a=True) return False; newbool operator-(newbool a) if(a=False)return True; return False; 75 main() newbool b1=True,b2=False,b3=True; b1=b1+b2; cout long factorial(int number); void main(void) int i,selections,elements; coutselections; /3 coutelements; /28 double answer=elements; for(i=1;i1) value*=number-; return value; 81 long factorial(int number) if(number1 fact(3) fact(2) * 3 fact(1) * 2 =1 82 运行结果 83 2.Hanoi塔问题 有3个立柱A,B,C,A柱上穿有大小 不等的圆盘64个,较大的圆盘在下,较小 者在上。要求借助于B柱把A柱上的64个圆 盘移到C柱,规则: (1)每次只能把一个柱上最上面的圆盘移至 另一个柱的最上层; (2)保持在每个柱上的圆盘较大者在下,较 小者在上。 84 移动前 移动后 85 ABC 1 2 3 ABC ABC 86 ABC ABC CBA ABC 87 ACB ABC CBA 88 /prog

温馨提示

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

评论

0/150

提交评论