函数与运算符的重载.ppt
《函数与运算符的重载.ppt》由会员分享,可在线阅读,更多相关《函数与运算符的重载.ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5 5章章 函数与运算符的重载函数与运算符的重载5.1 5.1 三次方程求根程序的设计三次方程求根程序的设计5.2 5.2 函数的说明与使用函数的说明与使用5.3 5.3 函数的嵌套与递归函数的嵌套与递归5.4 5.4 函数与运算符的重载函数与运算符的重载5.5 5.5 函数与函数与C+C+程序结构程序结构5.6 5.6 程序实例程序实例15.1 5.1 三次方程求根程序的设计三次方程求根程序的设计-计算三次方程计算三次方程x x3 3+px+q=0+px+q=0的一个实根的公式为的一个实根的公式为x xr r=n为了从系数为了从系数p p、q q 计算实根计算实根x xr r,把公式的计
2、算分解为下面几把公式的计算分解为下面几步:步:1 1)令实数)令实数x xr rA+B;A+B;2 2)令实数)令实数A,B A,B 分别为实数分别为实数 R,S R,S 的立方根:的立方根:3 3)令)令 R=-q/2+a,S=-q/2R=-q/2+a,S=-q/2a;(5.2)a;(5.2)4 4)令)令 a=a=sqrtsqrt(q/2)*(q/2)+(q/3)*(q/3)*(q/3);(q/2)*(q/2)+(q/3)*(q/3)*(q/3);实际的计算过程为:实际的计算过程为:用用(4)(4)计算得到计算得到a;a;用用(3)(3)计算得到计算得到 R R 和和S S;求出;求出 R
3、 R 和和 S S 的立方根的立方根 A A 和和 B;B;最后得到实根最后得到实根x xr r。2 5.1 5.1 三次方程求根程序的设计三次方程求根程序的设计计算立方根的迭代公式计算立方根的迭代公式 Float Float cuberootcuberoot(float xfloat x)/精确到小数点后精确到小数点后6 6位位 float root,float root,crootcroot;const float const float epseps1e1e6 6;crootcrootx x;dodo rootrootcrootcroot;crootcroot(2*root2*rootx
4、/x/(root*root*rootroot)/3/3;whilewhile(fabsfabs(crootcrootrootroot)epseps););returnreturn(crootcroot););3 5.1 5.1 三次方程求根程序的设计三次方程求根程序的设计#include#includeiostream.hiostream.h /program5-1/program5-1#include#includemath.hmath.h float float cuberootcuberoot(floatfloat););void mainvoid main(voidvoid)float
5、 p,q,float p,q,xrxr;coutcoutInput parameters Input parameters p,qp,q:;cincinp pq;q;float afloat asqrtsqrt(q/2)*(q/2)+(q/3)*(q/3)*(q/3);(q/2)*(q/2)+(q/3)*(q/3)*(q/3);xrxrcuberootcuberoot(q q2 2a a)cuberootcuberoot(q q2 2a a););coutcoutendlendlThe real root of the equation isThe real root of the equat
6、ion isxrxr;float float cuberootcuberoot(float xfloat x)4 5.1 5.1 三次方程求根程序的设计三次方程求根程序的设计 课本课本p129p129显示了不使用函数的程序。其中显示了不使用函数的程序。其中crootcroot 的立方根的运算的立方根的运算进行了两次进行了两次,所以该计算程序要重复两次所以该计算程序要重复两次,当程序较长当程序较长,或计算次或计算次数更多时,采用数更多时,采用“子程序子程序”的方案可以大大缩短程序的长度。的方案可以大大缩短程序的长度。特别是当程序比较复杂时,可以使得程序显得清晰,在特别是当程序比较复杂时,可以使得
7、程序显得清晰,在program5_1 program5_1 中,中,mainmain()中不涉及计算立方根的细节,显得简()中不涉及计算立方根的细节,显得简洁,而在洁,而在cuberootcuberoot()中只解决一个浮点数的立方根的计算,也()中只解决一个浮点数的立方根的计算,也很清楚。很清楚。另外,还可以把立方根的计算与另外,还可以把立方根的计算与C+C+语言中的运算符和标准函数对语言中的运算符和标准函数对应起来,当在程序中对于应起来,当在程序中对于cuberootcuberoot(y y)给出了定义之后,就可)给出了定义之后,就可以在主函数或其它用户定义的函数中,像运算符或标准函数那样
8、以在主函数或其它用户定义的函数中,像运算符或标准函数那样使用了,如使用了,如cuberootcuberoot(x x)的使用与)的使用与a+ba+b,sinsin(x x)的使用没有)的使用没有什么区别。什么区别。55.2 5.2 函数的说明与使用函数的说明与使用C+C+程程序序允允许许两两种种函函数数说说明明语语句句的的形形式式,我我们们把把它它们们分分别别称称为为函数原型(或函数声明)和函数定义。函数原型(或函数声明)和函数定义。n1 1函数原型函数原型n函数原型(亦称函数声明)用来指出函数的名称,类型和参函数原型(亦称函数声明)用来指出函数的名称,类型和参数,其格式为:数,其格式为:属性
9、说明属性说明类型类型函数名函数名(参数表参数表););intint add(add(intint a,a,intint b);b);inline void swap(float&s,float&t);inline void swap(float&s,float&t);void print(char*)void print(char*);65.2.1 5.2.1 函数的说明函数的说明 属属性性说说明明:可可缺缺省省,一一般般可可以以是是下下面面的的关关键键字字之之一一:inlineinline,staticstatic,virtual,friend virtual,friend 等。等。inli
10、ne inline 表示该函数为内联函数;表示该函数为内联函数;static static 表示该函数为静态函数;表示该函数为静态函数;virtual virtual 表示该函数为虚函数;表示该函数为虚函数;friend friend 表示该函数为某类表示该函数为某类(class)(class)的友元函数。的友元函数。类型:指函数的返回类型。类型:指函数的返回类型。函数名:一个标识符。函数名:一个标识符。参数表:它可能为空,参数表:它可能为空,void void 或或类型类型参数名参数名,类型类型参数名参数名 的形式。的形式。main()main(),print(voidprint(void)
11、,cuberoot(floatcuberoot(float x)x),add(intadd(int a,inta,int b)b)75.2.1 5.2.1 函数的说明函数的说明n 2 2函数定义函数定义n函数定义与函数原型的主要区别是它还包括函数体,函数定义与函数原型的主要区别是它还包括函数体,其格式为:其格式为:属性说明属性说明类型类型函数名函数名(参数表参数表)函数体函数体 属性说明,返回类型,函数名与函数原型一致,参属性说明,返回类型,函数名与函数原型一致,参数表中不可省略参数名。数表中不可省略参数名。函数体函数体:由和括起来的复合语句即程序块。由和括起来的复合语句即程序块。progra
12、m 5_1 program 5_1 的最后的最后12 12 行就是一个函数定义行就是一个函数定义。8函数的分类方法函数的分类方法 1 1 从从使用角度使用角度分类分类 2 2 从从函数形式函数形式分类分类9 (1 1)从使用角度分类从使用角度分类 从从使使用用角角度度划划分分,可可将将函函数数分分为为:系系统统预预定定义义的的标标准准库库函函数数(如如,sinsin,absabs等等),以以及及由由用用户户自自定义定义的函数。的函数。程程序序中中可可直直接接使使用用(调调用用)系系统统预预定定义义的的标标准准库库函函数数,但但要要求求在在调调用用前前使使用用编编译译预预处处理理指指令令incl
13、udeinclude将对应的头文件包含进来。将对应的头文件包含进来。由由用用户户自自定定义义的的函函数数与与系系统统预预定定义义的的标标准准库库函函数数的的不不同同点点在在于于,自自定定义义函函数数的的函函数数名名、参参数数个个数数、函函数数返返回回值值类类型型以以及及函函数数所所实实现现的的功功能能等等都都完完全全由由用户程序来规定(指定)用户程序来规定(指定)。10(2 2)从函数形式分类从函数形式分类 从从函函数数形形式式划划分分,可可分分为为无无参参函函数数与与有有参参函函数数两两类类。对对无无参参函函数数来来说说,调调用用它它们们时时不不需需要要提提供供实实际际参参数数;而而对对有有
14、参参函函数数进进行行调调用用时时,必必须须提提供供所所需需个个数数的的且且具具有有相相匹匹配配数数据据类类型型的的实际参数。实际参数。11无参函数的定义无参函数的定义 。无参函数定义无参函数定义的一般形式的一般形式 ()()1 .n 通常用于通常用于实现某种固定功能实现某种固定功能。例如:。例如:void void printStarprintStar().().就就自自定定义义了了一一个个叫叫做做printStarprintStar的的无无参参函函数数,比比如可用它来实现打印出一行共如可用它来实现打印出一行共1010个个“*”的固定功能。的固定功能。12 有参函数定义有参函数定义的一般形式的
15、一般形式 ()1 .n 通通过过调调用用处处提提供供的的不不同同实实参参值值来来计计算算出出其其对对应应的的函函数数值值、或或实现某种与传递过来的那些不同值有关的某种功能实现某种与传递过来的那些不同值有关的某种功能。例如:。例如:void void printStar(intprintStar(int k).k).就就自自定定义义了了一一个个叫叫做做printStarprintStar的的具具有有1 1个个intint型型形形参参k k的的函函数,比如可用它来实现打印出一行共数,比如可用它来实现打印出一行共k k个个“*”的自定义功能。的自定义功能。135.2.2 5.2.2 函数的调用函数的
16、调用函函数数调调用用是是已已定定义义函函数数的的一一次次实实际际运运行行,与与某某类类型型的的一一个个变变量量和和后后文文中中某某类类的的一一个个对对象象类类似似,函函数数调调用用是是函函数数定定义义的的一一个个“实实例例”。在在C+C+程程序序中中,除除mainmain函函数数外外,其其它它任任一一函函数数的的执执行行都都是是通通过过在在mainmain函函数数中中直直接接或或间间接接地地调调用用该该函函数数而而引引发发的的。调调用用一一个个函函数数就就是是去去执执行行该该函函数数之之函函数数体体的的过过程。程。对无参函数进行调用对无参函数进行调用的一般形式为:的一般形式为:()()例如:例
17、如:printStarprintStar();();14 对有参函数进行调用对有参函数进行调用的一般形式为:的一般形式为:()例如:例如:printStar(26);printStar(26);其其中中函函数数说说明明中中的的参参数数称称为为形形式式参参数数(形形参参),函函数数调调用用中中的的参参数数称称为为实实际际参参数数(实实参参)。实实参参表表在在参参数数个个数数、参参数数顺顺序序、以以及及参参数数类类型型等等方方面面要要与与被被调调函函数数的的形形参参表表之之间间有有一一个个一一一一对对应应的的相相互互匹匹配配关关系系。编编译译器器将将根根据据参参数数的的顺顺序序,来来逐逐一一实实现
18、现实实参参与与对对应应形形参参的的“结结合合”,而而后后执执行行一一遍遍函函数数体体(而而完成本次的函数调用)。完成本次的函数调用)。15 计算机对计算机对函数进行调用函数进行调用的执行顺序的执行顺序以以Program5-1Program5-1为例为例(1)(1)根据调用语句中的函数名根据调用语句中的函数名(cuberootcuberoot)在整个程序中搜索同名函数定在整个程序中搜索同名函数定义;义;(2)(2)对实参数的参数个数,类型,顺序进行核对,判定是否与函数定义对实参数的参数个数,类型,顺序进行核对,判定是否与函数定义中的形参表对应一致,在上例中只有一个浮点型参数;中的形参表对应一致,
19、在上例中只有一个浮点型参数;(3)(3)根据参数的类型(值参数或引用参数)进行值参数的值传递或引用根据参数的类型(值参数或引用参数)进行值参数的值传递或引用参数的换名,在上例中即是要把实参表达式的值计算出来赋给形参参数的换名,在上例中即是要把实参表达式的值计算出来赋给形参x x;(4)(4)运行函数体代码;运行函数体代码;(5)(5)返回调用点,并返回所要求的函数值,即返回计算结果返回调用点,并返回所要求的函数值,即返回计算结果crootcroot 的值。的值。16 关于关于函数原型的一点说明函数原型的一点说明 当当函函数数调调用用从从书书写写顺顺序序上上先先于于函函数数定定义义时时,C+C+
20、要求必须事先列出这一函数的函数原型。要求必须事先列出这一函数的函数原型。(1 1)无参函数)无参函数定义的函数原型定义的函数原型 ()();(2 2)有参函数)有参函数定义的函数原型定义的函数原型 ();注注意意,与与函函数数定定义义的的一一般般形形式式相相比比,相相当当于于用用分号代换了函数体,而成为其相应的函数原型。分号代换了函数体,而成为其相应的函数原型。17 5.2.3 5.2.3 函数的返回函数的返回函数的返回完成两项任务:函数的返回完成两项任务:n (1)(1)把运行控制从函数体返回到函数调把运行控制从函数体返回到函数调用点。用点。在在program5-1program5-1中就是
21、在计算中就是在计算cuberootcuberoot(-(-q/2+a)q/2+a)之后再返回到语句之后再返回到语句 xrxr=cuberootcuberoot()+()+cuberootcuberoot()()的的计算过程中。计算过程中。n(2)(2)根据返回值要求,返回所需要的数根据返回值要求,返回所需要的数据值。据值。18 5.2.3 5.2.3 函数的返回函数的返回n函数的返回值有下面几种情形:函数的返回值有下面几种情形:n1.1.返回返回void void 类型类型 如果函数无值返回,应说明为如果函数无值返回,应说明为void void 类型。未作类型说明的函数,系统类型。未作类型说明
22、的函数,系统认为是认为是intint 类型函数,应返回一整型值。类型函数,应返回一整型值。n2 2返回数值类型返回数值类型 最常见的函数是返回一个数值的函数。最常见的函数是返回一个数值的函数。例如:例如:intint add add(intint a a,intint b b););当函数要返回的数值不止一个时,情况比较复杂,一般它可以以结构或当函数要返回的数值不止一个时,情况比较复杂,一般它可以以结构或类的形式,也可以以结构,数组或对象指针类型方式实现,这样的实例类的形式,也可以以结构,数组或对象指针类型方式实现,这样的实例在后面的章节可以见到。在后面的章节可以见到。n 3 3返回引用类型返
23、回引用类型 值返回方式是值返回方式是C C 和和Pascal Pascal 语言中唯一的返回方式,语言中唯一的返回方式,C+C+语言提供的引用语言提供的引用返回概念是一种很强的功能,当函数定义中把该函数说明为某类型的引返回概念是一种很强的功能,当函数定义中把该函数说明为某类型的引用类型时,该函数调用后返回的不单是值,而是包含返回值的变量(或用类型时,该函数调用后返回的不单是值,而是包含返回值的变量(或对象)。由于返回引用与引用类型有关,所以这样的实例将在下节介绍。对象)。由于返回引用与引用类型有关,所以这样的实例将在下节介绍。19函数应用实例函数应用实例1.1.实例实例1-1-无须给出函数无须
24、给出函数f f的原型的原型 设设 f(x)=(x*x+x+1)/2-5.5f(x)=(x*x+x+1)/2-5.5。(1 1)求求z=(f(2.5)+2*f(6)/f(4.3)z=(f(2.5)+2*f(6)/f(4.3),并显示结果并显示结果z z。(2 2)对任意输入的一个实数对任意输入的一个实数a a,求出求出f(a)f(a)并显示。并显示。程序执行后的交互结果如下:程序执行后的交互结果如下:z=4.90618z=4.90618Input a=Input a=1010f(a)=50f(a)=5020程序编制:程序编制:#include include double f(double x)
25、double f(double x)double y;double y;y=(x*x+x+1)/2-5.5;y=(x*x+x+1)/2-5.5;return(y);return(y);/对非对非voidvoid类型的函数,必须有一个类型的函数,必须有一个 /return /return语句,由它返回函数值语句,由它返回函数值 21 void main()void main()double z,a;double z,a;z=(f(2.5)+2*f(6)/f(4.3);/z=(f(2.5)+2*f(6)/f(4.3);/调用自定义函数调用自定义函数f fcoutcoutz=zz=zendlendl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 运算 重载
限制150内