面向对象编程技术-3(第三章 函数).ppt

上传人:asd****56 文档编号:87677370 上传时间:2023-04-16 格式:PPT 页数:42 大小:207.50KB
返回 下载 相关 举报
面向对象编程技术-3(第三章 函数).ppt_第1页
第1页 / 共42页
面向对象编程技术-3(第三章 函数).ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《面向对象编程技术-3(第三章 函数).ppt》由会员分享,可在线阅读,更多相关《面向对象编程技术-3(第三章 函数).ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第三章第三章 函数函数l函数的定义与使用l内联函数l带默认参数的函数l函数重载l使用C+系统函数本章的主本章的主要内容。要内容。第一节第一节 函数的定义与使用函数的定义与使用1.函数的分类函数的分类一一、从从函函数数定定义义的的角角度度看看,可可分分为为库库函函数数和和用用户户定定义义函函数数两两种。种。(1)库函数 由系统提供,用户无须定义,只需在程序前包含有该函数原型的头文件即可调用。在前面各章中用到printf、scanf 等函数均属此类。(2)用户定义函数 由用户按需要写的函数。不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明。第一节第一节 函数的定义与使

2、用函数的定义与使用二、从二、从功能功能的角度分类。的角度分类。(1)有返回值函数 执行完后将向调用者返回一个执行结果,称为函数返回值。必须在函数定义和函数说明中明确返回值的类型。函数定义和函数说明中明确返回值的类型。(2)无返回值函数无返回值函数 执行完成后不向调用者返回函数值。可指定它的返回为“空类型”,空类型的说明符为“void”。第一节第一节 函数的定义与使用函数的定义与使用三三、从从主主调调函函数数和和被被调调函函数数之之间间数数据据传传送送的的角角度度看看又又可可分分为为无参函数和有参函数两种。无参函数和有参函数两种。(1).无参函数 函数定义、函数说明及函数调用中均不带参数。主调函

3、数和被调函数之间不进行参数传送。(2)有参函数 在函数定义及函数说明时都有参数,称为形式参数(简称形参)。在函数调用时也必须给出实际参数(简称为实参)。进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。第一节第一节 函数的定义与使用函数的定义与使用2.函数的定义函数的定义 类型说明符 函数名()声明部分 语句 例:int max(int x,int y)return(xy?x:y);void prt(char*strx)coutstr;1.形参出现在函数定义中,在整个函数体内都可以使用,函数未被调用时,系统不给它分配存储空间,当函数被调用时系统才给分配储存空间,用来接受从主调函数

4、传递过来的数据,当该函数调用结束后,则立即释放其储存空间。2.实参出现在主调函数中,即调用时写入函数括号中的参数,要求有确定的值。调用时将实参数据传递给对应的形参,进入被调函数后,实参变量不能使用。3.形参与实参的的关系:形参和实参的功能是作数据传递。发生函数调用时(形、实结合),主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。注意函数参数第一节第一节 函数的定义与使用函数的定义与使用l说明:说明:1.函数可以声明有某一种类型的返回值,也可以声明空返 回值(void),如不声明返回值,则默认类型是整形。2.函数不允许嵌套定义,函数之间的关系是平行的。也就是说,在一个

5、函数的函数体内,不能再定义另一个函数。3.函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。函数还可以自己调用自己,称为递归调用。第一节第一节 函数的定义与使用函数的定义与使用l3、函数调用、函数调用函数调用的一般形式 函数名(实际参数表)注意:注意:1.实参的类型,个数,顺序都应与形参一致。2.实参可以是常量、变量、表达式、函数等。必须有确定值。3.实参和形参在数量上,类型上,顺序上应严格一致。4.参数的传值方式有传值和传地址两种方式例 编写一个求x的n次方的函数#include using namespace std;doublepower(double x,int n);

6、int main()cout 5 to the power 2 is power(5,2)y?x:y);.Main()Coutmax(3.5,7.9)endl;结果是!2、嵌套调用:、嵌套调用:被调函数在执行的过程中又调用其它函数main()fa();.fb();fa().fb();.fb();.例 输入两个整数,求平方和#include using namespace std;int main()int a,b;int fun1(int x,int y);cinab;couta、b的平方和:的平方和:fun1(a,b)endl;int fun1(int x,int y)int fun2(in

7、t m);return(fun2(x)+fun2(y);int fun2(int m)return(m*m);3、递归调用:、递归调用:函数直接或间接的调用自身如求 n!、汉诺塔 递归过程的两个阶段:递推:4!=43!3!=32!2!=21!1!=10!0!=1未知 已知回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知未知 已知已知例 求n!分析:计算分析:计算n!的公式如下:的公式如下:这是一个递归形式的公式,应该用递归函数实现。这是一个递归形式的公式,应该用递归函数实现。#include using namespace std;long fac(int

8、n)long f;if(n0)coutn0,data error!endl;else if(n=0)f=1;else f=fac(n-1)*n;return(f);int main()/long fac(int n);int n;long y;coutn;y=fac(n);coutn!=yendl;4 函数的参数传递(传值与引用)函数的参数传递(传值与引用)在函数被调用时才分配形参的存储单元。在函数被调用时才分配形参的存储单元。实参可以是常量、变量或表达式。实参可以是常量、变量或表达式。实参类型必须与形参相符。实参类型必须与形参相符。传递时是传递参数值,即单向传递。传递时是传递参数值,即单向传

9、递。值传递在值传递的过程中,参数值是单向传递,一旦形参获得了值,便与实参脱离关系,此后形参的改变都不会影响到形参。例 输入两 整数交换后输出#includeusing namespace std;void Swap(int a,int b);int main()int x(5),y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;void Swap(int a,int b)int t;t=a;a=b;b=t;a=b;5 x10 y5 a10 b执行主函数中的函数调用Swap(x,y);t=a;5 x10 y5 a10 b5tb=t;

10、5 x10 y10 a5 b5t5 x10 y10 a10 b5t在Swap子函数中返回主函数以后5x10y1919引用传递(引用做形参)l引用的概念:引用就是给变量或对象取的一个别名。引用的概念:引用就是给变量或对象取的一个别名。int i,j;int&ri=i;/建立一个建立一个intint型的引用型的引用riri,并将其并将其 /初始化为变量初始化为变量i i的一个别名的一个别名j=10;ri=j;/相当于相当于 i=j;l声明一个引用时,必须同时对它进行初始化,使它指向一个声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。已存在的对象。l一旦一个引用被初始化后,就不能改

11、为指向其它对象。一旦一个引用被初始化后,就不能改为指向其它对象。l引用可以作为形参引用可以作为形参 void swap(int&a,int&b).例 输入两个整数交换后输出#includeusing namespace std;void Swap(int&a,int&b);int main()int x(5),y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;void Swap(int&a,int&b)int t;t=a;a=b;b=t;t=a;x x5t5x 的别名a ax xy y510y 的别名x 的别名a ab by 的别

12、名x 的别名a ab bx x10y y10a=bb=t;y5t5y 的别名b bx xy y105Swap(x,y);22引用的优点l具有指针的威力。引用调用不仅具有传值方式函数调用语法具有指针的威力。引用调用不仅具有传值方式函数调用语法的简单性和可读性,同时也具有指针的威力。的简单性和可读性,同时也具有指针的威力。l引用可以避免对象的拷贝。在对象的传递中,为避免拷贝对引用可以避免对象的拷贝。在对象的传递中,为避免拷贝对象的开销,可用引用的方式来传递对象。因为引用仅仅是一象的开销,可用引用的方式来传递对象。因为引用仅仅是一个别名,不是另一个对象,不占有空间。它随目标而产生,个别名,不是另一个

13、对象,不占有空间。它随目标而产生,随目标的消亡而消亡。随目标的消亡而消亡。l引用可以避免原始数据被修改。在引用可以避免原始数据被修改。在C+C+中通常用指针传递要中通常用指针传递要修改的参数,用常引用传递不要修改的参数,常引用的定义,修改的参数,用常引用传递不要修改的参数,常引用的定义,只要把只要把constconst关键字放在参数声明的类型说明前即可。关键字放在参数声明的类型说明前即可。引用于指针的区别:l操作方式不同。指针是间接访问,引用时直接访操作方式不同。指针是间接访问,引用时直接访问。问。l指针本身是一个变量,声明时可以不初始化,而指针本身是一个变量,声明时可以不初始化,而引用是别名

14、,必须初始化,指针可以指向其他变引用是别名,必须初始化,指针可以指向其他变量,而引用一旦确立,就不能作为其他变量的别量,而引用一旦确立,就不能作为其他变量的别名。名。第二节第二节 内联函数内联函数l目的:提高程序运行效率目的:提高程序运行效率l缺点:程序长度增大缺点:程序长度增大l编译时在调用处用函数体进行替换编译时在调用处用函数体进行替换,节省了参数传递、节省了参数传递、控制转移等开销。控制转移等开销。l内联函数内联函数格式格式 inline 函数声明函数声明说明:是否真正是内联函数由编译器决定。说明:是否真正是内联函数由编译器决定。函数规模过大,编译器一般不作为内联函数处理函数规模过大,编

15、译器一般不作为内联函数处理 包含循环一般不当作内联函数包含循环一般不当作内联函数例 内联函数应用举例#includeusing namespace std;inline double CalArea(double radius)return 3.14*radius*radius;int main()double r(3.0);double area;area=CalArea(r);coutareaendl;return 0;第三节第三节 带默认值参数的函数带默认值参数的函数定义:在函数定义时可以预先给出参数的默认值int sum_calc(int n,int i=1)int sum=0;int

16、 j;for(j=i;j=n;j+)sum+=j;return sum;注意:注意:1.默认的形参按自右到左的顺序定义2.在调用可以使用部分默认形参值默认形参值的说明次序l默认形参值必须默认形参值必须从右向左从右向左顺序声明,并顺序声明,并且在默认形参值的右面不能有非默认形且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参参值的参数。因为调用时实参取代形参是从左向右的顺序。是从左向右的顺序。l例:例:int add(int x,int y=5,int z=6);/正确正确int add(int x=1,int y=5,int z);/错误错误int add(int x=1,i

17、nt y,int z=6);/错误错误带默认形参值的函数例例:int add(int a,int b=2,int c=3,int d=4,int e=5)return(a+b+c+d+e);void main()coutadd(1)endl;coutadd(1,9)endl;coutadd(1,9,8)endl;coutadd(1,9,8,7)endl;默认形参值与函数的调用位置l调用出现在函数体实现之前时,默认形参值必调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。实现之后时,默

18、认形参值需在函数实现时给出。l例:例:int add(int x=5,int y=6);int main()add();/调用在实现前调用在实现前int add(int x,int y)return x+y;int add(int x=5,int y=6)return x+y;int main()add();/调用在实现后调用在实现后带默认形参值的函数默认形参值的作用域l在相同的作用域内,默认形参值的说明应在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。许说明不同的默认形参。l例:例:int add(int x=

19、1,int y=2);int main()int add(int x=3,int y=4);add();/使用局部默认形参值(实现使用局部默认形参值(实现3+4)void fun(void).add();/使用全局默认形参值(实现使用全局默认形参值(实现1+2)带默认形参值的函数第四节第四节 函数重载函数重载一、重载的含义:C+允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。形参类型不同int add(int x,int y);float add(float x,float y);形参个数不同int add(int x,int y);int add(int

20、 x,int y,int z);如:如:注意事项注意事项:int add(int x,int y);int add(int a,int b,int c);int add(int x,int y);void add(int x,int y);1.重载函数的形参必须不同重载函数的形参必须不同:个数不同或类型不同。个数不同或类型不同。2.编译程序将根据实参和形参的类型及个数的最佳匹配来选编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。择调用哪一个函数。不能构成重载不能构成重载3.编译器不以形参名来区分;编译器不以返回值来区编译器不以形参名来区分;编译器不以返回值来区分分int a

21、dd(int x,int y)return x+y;float add(float x,float y)return x-y;4.不要将不同功能的函数声明为重载函数,以免出现调不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。用结果的误解、混淆。NO!例3-16重载函数应用举例编写两个名为编写两个名为add的重载函数,分别的重载函数,分别实现两整数相加、两实数相加的功能。实现两整数相加、两实数相加的功能。函 数 重 载#includeusing namespace std;int main()int m,n;double x,y;int add(int m,int n);dou

22、ble add(double x,double y);coutmn;coutinteger m+n=add(m,n)endl;36coutxy;coutreal number x+y=add(x,y)endl;int add(int m,int n)return m+n;double add(double x,double y)return x+y;37运行结果:Enter two integer:3 5integer 3+5=8Enter two real number:2.3 5.8real number 2.3+5.8=8.138 C+系统函数lC+的系统库中提供了几百个函数可的系统库中

23、提供了几百个函数可供程序员使用。供程序员使用。例如:求平方根函数(例如:求平方根函数(sprt)、)、求绝对值求绝对值函数(函数(abs)等。等。l使用系统函数时要包含相应的头文件。使用系统函数时要包含相应的头文件。例如:例如:math.h 或或 cmath使用C+系统函数例3-17系统函数应用举例l题目:题目:从键盘输入一个角度值,求出该角度的正弦值、余弦从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。值和正切值。l分析:分析:系统函数中提供了求正弦值、余弦值和正切值的函数:系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的说明在头文件函数的说明在头文件math.h中中。#include#includeusing namespace std;const double pi(3.14159265);int main()double a,b;cina;b=a*pi/180;coutsin(a)=sin(b)endl;coutcos(a)=cos(b)endl;couttan(a)=tan(b)endl;运行结果:运行结果:30sin(30)=0.5cos(30)=0.866025tan(30)=0.5773541作业l习题习题3-2,3-3,3-4,3-6

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁