函数与运算符的重.ppt





《函数与运算符的重.ppt》由会员分享,可在线阅读,更多相关《函数与运算符的重.ppt(91页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5 5章章 函数,函数与运算符的重载函数,函数与运算符的重载要点要点 函数函数 函数的重载函数的重载 运算符的重载运算符的重载1n函数:参数化的子程序;函数:参数化的子程序;n从从SP的观点,函数:程序长度的观点,函数:程序长度;整个程序整个程序子任务子任务;n从运算的角度,函数从运算的角度,函数:C+提供的用户定义提供的用户定义 的运算。运算符的运算。运算符:系统提供的运算系统提供的运算;n作为作为OOP的的C+,类,类:核心,类核心,类=数据数据+方法,方法,方法方法/类的函数成员类的函数成员:对数据的运算和处理。对数据的运算和处理。函数在函数在C+中的意义中的意义2例:按照例:按照C
2、ardan公式,计算公式,计算3次方程次方程x3+px+q=0 的一个实根:的一个实根:5.1 3次方程求根程序的设计次方程求根程序的设计方法:方法:(1)计算浮点数的立方根的程序作为函数计算浮点数的立方根的程序作为函数 (2)主程序中主程序中2次调用该函数次调用该函数 (3)计算计算 迭代公式:迭代公式:rn+1=2/3*rn+y/(3rn2)3#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(
3、-q/2+a)+cuberoot(-q/2-a);coutendlThe real root of the equation is eps);return(croot);5执行结果执行结果6 属性说明属性说明 类型类型 函数名函数名(参数表参数表);5.2 函数的说明与使用函数的说明与使用1.1.函数说明函数说明函数原型函数原型/声明声明-指出函数的名称,类型和参数指出函数的名称,类型和参数例:例:int add(int a,int b);inline void swap(float&,float&);void print(char*);可省略可省略7oinline:内联函数内联函数 P125
4、ostatic:静态函数静态函数 P170ovirtual:虚函数虚函数 P202ofriend:某类的友元函数某类的友元函数 P170 属性说明属性说明 类型类型 函数名函数名(参数表参数表);可缺省可缺省属性说明属性说明函数的返函数的返回类型回类型标识符标识符除除main()函数和类的构造函数和类的构造/析构函数之析构函数之外,所有函数必须指出返回类型外,所有函数必须指出返回类型8例:例:/program 7_1.cppclass stack float datamaxsize;int top;public:stack(void);/构造函数构造函数 P168 stack(void);/析
5、构函数析构函数 P169 ;stack:stack(void)top=0;coutstack initialized.endl;9例:例:class point /point:平面上一点平面上一点private:float Xcoord,Ycoord;public:void SetX(float x)Xcoord=x;/初始化初始化 void SetY(floaty)Ycoord=y;/初始化初始化 float GetX(void)return Xcoord;float GetY(void)return Ycoord;;point p1;point*p2=new point;10例:例:mai
6、n()print(void)cuberoot(float x)add(int a,int b)属性说明属性说明 类型类型 函数名函数名(参数表参数表);参数表参数表空空/void/,例:例:add(int,int)swap(float&,float&)/引用方式引用方式函数原型中的参数表可忽略参数名函数原型中的参数表可忽略参数名11程序中某函数的调用语句出现在该函数的定程序中某函数的调用语句出现在该函数的定 义前,必须在调用语句之前列出函数原型;义前,必须在调用语句之前列出函数原型;函数原型的使用函数原型的使用/program5_1.cpp#include#includefloat cuber
7、oot(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例:例
8、: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.1.函数说明函数说明函数定义函数定义属性说明属性说明 类型类型 函数名函数名
9、(参数表参数表)函数体函数体与函数原型一致与函数原型一致不可省略不可省略参数名参数名复合语句复合语句函数定义与函数原型的主要区别函数定义与函数原型的主要区别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)Ho
10、ur=NewH;Minute=NewM;Second=NewS;/函数体函数体 162.2.函数调用函数调用 函数调用的两要素函数调用的两要素-已定义函数的实际运行已定义函数的实际运行函数名函数名实参表实参表例:例:/program5_1.cpp函数的调用实施过程函数的调用实施过程 xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);(1)搜索搜索同名函数同名函数定义;定义;/函数重载函数重载(2)核对实参的核对实参的参数个数,类型,顺序参数个数,类型,顺序,判定,判定 是否与函数定义中的形参表一致;是否与函数定义中的形参表一致;例:例:print(void)17/计算计
11、算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)把运行控制从函数体返回到函数调用点;把运行控制从函数体返回到函数调用点
12、;(2)返回数据值。返回数据值。3.3.函数的返回函数的返回函数的返回完成的任务函数的返回完成的任务例:例:void main(void).;xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);float cuberoot(float x).return(croot);19例:例:void print()cout“HelloWorld!”;void show()cout1个,以结构个,以结构/类,数组类,数组/对对象象指针类型方式实现指针类型方式实现例:例:int add(int a,int b);/返回返回1个值个值 21例:例:#includeclass comple
13、x /复数类声明复数类声明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 in
14、t&maxRef(int&x,int&y)/系统不生成返回值的副本系统不生成返回值的副本if(xy)return x;return y;void main()int a,b;coutab;coutmaxRef(a,b)endl;返回引用类型返回引用类型23例:例:void print(void);int getx();4.4.函数的参数函数的参数无参函数无参函数-void/空:无参空:无参1/多个参数多个参数例:例:/对对n元元int型数组型数组array排序排序 void sort(int n,char*array);/求求3个实数个实数a,b,c中最大者中最大者 float max(fla
15、ot a,float b,float c);241/多个参数多个参数定义中注意参数表的组成。不同的函数根据定义中注意参数表的组成。不同的函数根据函数名和参数表来区分,只有二者完全一致函数名和参数表来区分,只有二者完全一致才是同一函数。才是同一函数。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;25不定个数参数不定个数参数-参数个数是变化的参数个数是变化的例例:设计电话计费函数,为了计算
16、通话费,不同设计电话计费函数,为了计算通话费,不同 的通话类型的通话类型(市话,长途,数据与通讯,市话,长途,数据与通讯,BP 机等机等)有不同数目的参数。有不同数目的参数。26不定个数参数不定个数参数处理参数个数不定的途径处理参数个数不定的途径例:例: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)调用调用f(int a,int b)f(x,y,0)f(int a,int b,int)有的有的C+版本版本(VC6.0)提供库函数,支持提供库
17、函数,支持void abc(int i,);为了区分函数,允许参数表中包含无名参数为了区分函数,允许参数表中包含无名参数27C+允许为函数定义可缺省参数允许为函数定义可缺省参数处理参数个数不定的途径处理参数个数不定的途径例:例:int sqrsum(int a,int b,int c=0)/c:可缺省参数可缺省参数 return a*a+b*b+c*c;合法的调用方式合法的调用方式:sqrsum(x,y,z);/x,y,z:int型型,c=z sqrsum(x+y,x-y);sqrsum(x,y);参数表中可有任意多个参数为可缺省参数,所参数表中可有任意多个参数为可缺省参数,所有可缺省参数必须
18、列后。调用该函数时,不允有可缺省参数必须列后。调用该函数时,不允许部分缺省许部分缺省:省去全部缺省参数省去全部缺省参数/一个也不省。一个也不省。28例:例:int sqrsum(int a,int b,int c=0,int 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);/,全部不缺省,全部不缺省295.5.值调用与引用调用值调用与引用调用赋值调用方式赋值调用方式赋值形参:函数定义的参数中,除了说明为赋
19、值形参:函数定义的参数中,除了说明为 引用引用(&)的参数外,其余类型的形的参数外,其余类型的形 参都属于赋值形参。赋值形参在参都属于赋值形参。赋值形参在 函数的每次调用时,必须为每个函数的每次调用时,必须为每个 赋值形参创建新的参数变量。赋值形参创建新的参数变量。函数调用时,检查函数名及参数表,为值函数调用时,检查函数名及参数表,为值参分配内存,计算对应的参分配内存,计算对应的实参表达式实参表达式,把计算,把计算的值赋给刚创建的参数变量,运行函数体。的值赋给刚创建的参数变量,运行函数体。30实参表达式:函数调用语句中与赋值形参对应实参表达式:函数调用语句中与赋值形参对应 的实参:指定类型的常
20、量的实参:指定类型的常量/变量变量/表表 达式。函数调用时,计算该表达达式。函数调用时,计算该表达 式的值,作为初值赋给刚为赋值式的值,作为初值赋给刚为赋值 形参创建的参数变量。形参创建的参数变量。赋值调用方式赋值调用方式为赋值形参创建的变量局限于函数体的局部为赋值形参创建的变量局限于函数体的局部变量,作为该形参的实例,一旦运行完毕,变量,作为该形参的实例,一旦运行完毕,撤消该参数变量。撤消该参数变量。31例:定义函数;例:定义函数;int multiple3(int n)/n:赋值形参赋值形参 n=n*3;return n;调用函数调用函数multiple3 3次:次:int n=5;/n:
21、变量变量 coutmultiple3(2)multiple3(n)multiple3(3*n)nendl;/表达式表达式 6 15 45 5执行结果执行结果32实参表达式使用只计算值的表达式实参表达式使用只计算值的表达式实参表达式实参表达式例:例:3*n,x+y,&x,multiple3(n)对可能改变变量值的表达式,注意对可能改变变量值的表达式,注意:当当1个函数个函数 有多个赋值形参时,值传递过程中,多个实参有多个赋值形参时,值传递过程中,多个实参 表达式计算的次序。表达式计算的次序。例:例:n+,m=s+m*3 realpara(n+,n-);33例:例:void swap(int&a,
22、int&b)/a,b:引用形参引用形参 int temp=a;a=b;b=temp;引用调用方式引用调用方式引用形参:函数定义的参数表中,引用形参:函数定义的参数表中,&参数名参数名函数原型:函数原型:void swap(int&a,int&b);或或void swap(int&,int&);34(1)函数的调用语句中对应于引用形参的实参必须是函数的调用语句中对应于引用形参的实参必须是同类型的变量,非变量的表达式则不允许;同类型的变量,非变量的表达式则不允许;(2)参数传递的内容:参数传递的内容:地址;地址;(3)函数体的运行中,引用形参起函数体的运行中,引用形参起“换名换名”作用;作用;(4
23、)函数体运行结束,控制转回调用点时,该引用形函数体运行结束,控制转回调用点时,该引用形参与实参变量的对应关系终止。但调用过程中对参与实参变量的对应关系终止。但调用过程中对该实参变量的处理和操作的该实参变量的处理和操作的结果结果,保留下来。,保留下来。引用形参不同于赋值形参的参数传递机制的要点引用形参不同于赋值形参的参数传递机制的要点35例:例:void swap(int&a,int&b)/a,b:引用形参引用形参 int temp=a;a=b;b=temp;调用:调用:swap(&m,&n);/swap(&(m+2),&(n+3);/36例:例:void swap(int&a,int&b)/a
24、,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=7,z=353xyab37yzab5temp733temp3537例:指针例:指针 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&yab5temp5temp38引用调用,表面上与利用指针形参的赋值调引用调用,表面上与利用指针形参的赋值调用效果相同
25、,实际上优于指针用效果相同,实际上优于指针:不需要像指针不需要像指针参数那样通过间址访问。参数那样通过间址访问。函数采用引用参数的情形函数采用引用参数的情形改变某些变量的值;改变某些变量的值;占内存较多的参数占内存较多的参数(数组,对象数组,对象)。39int 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;/40char a23=a,bb;strcpy(a0,a1);couta0;416.6.函数的嵌套与递归函数的嵌套与递归函数嵌套函数嵌套函数的函数体中包含函数的函数体中包含1/多个函数调
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 运算

限制150内