1、2022年12月7日14时47分1第2讲 C+对C的函数的扩充及使用 2.1 授课内容授课内容 C+对C的函数的扩充及使用,包括以下几个主要部分:1函数原型声明、函数定义及调用;2函数的重载;3有默认参数的函数;4函数模板。2022年12月7日14时47分2第2讲 C+对C的函数的扩充及使用 2.2 授课要求授课要求1掌握函数定义的格式,掌握函数原型声明及函数调用;2掌握函数调用过程中参数传递的原理及有默认参数的函数调用;3掌握全局变量和局部变量的使用;4掌握函数重载的方法;5掌握保留字inline的含义与使用;6熟悉函数模板。2022年12月7日14时47分3第2讲 C+对C的函数的扩充及使
2、用 2.3 授课重点授课重点1函数的声明、定义及调用;2函数重载的方法。2.4 授课难点授课难点1函数的嵌套和递归调用;2函数模板。2022年12月7日14时47分41函数的声明函数的声明一个C程序是由若干个函数组成的。C+面向过程的程序设计沿用了C语言使用函数的方法。在C+面向对象的程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以通过类对象调用类中的函数。图1 函数调用的示意图。图图12022年12月7日14时47分51函数的声明函数的声明函数声明的格式函数声明的格式:函数类型函数类型 函数名(参数表);函数名(参数表);比如:int max(int x,int y);
3、void count()();无参数,返回无参数,返回值也为空。值也为空。2022年12月7日14时47分61函数的声明函数的声明定义函数格式定义函数格式类型标识符类型标识符 函数名(形式参数表列)函数名(形式参数表列)声明部分声明部分 语句语句 2022年12月7日14时47分71函数的声明函数的声明例如:int max(int x,int y)/函数首部,函数值为整型,有两个整型形参 int z;/函数体中的声明部分 z=xy?x:y;/将x和y中的大者的值赋给整型变量z return(z);/将z的值作为函数值返回调用点C+要求在定义函数时必须指定函数的类型函数的类型(即函数返回值类型)
4、。2022年12月7日14时47分81函数的声明函数的声明注意:注意:在在C+中,如果函数调用的位置在函数定义之前,中,如果函数调用的位置在函数定义之前,则要求在函数调用之前必须对所调用的函数则要求在函数调用之前必须对所调用的函数作函数作函数原型声明原型声明,这是强制性的(,这是强制性的(C语言是建议性的)。语言是建议性的)。2022年12月7日14时47分92形式参数和实际参数形式参数和实际参数在调用函数时,大多数情况下,函数是带参数的。(1)形式参数形式参数:在定义函数时函数名后面括号中的变量名称为形式参数(formal parameter,简称形参)。(2)实际参数实际参数:在主调函数中
5、调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为实际参数(actual parameter,简称实参)。2022年12月7日14时47分103函数的调用函数的调用(1)函数调用的一般形式)函数调用的一般形式函数名(实参表列)函数名(实参表列)(2)函数调用的方式)函数调用的方式 按函数在语句中的作用来分,可以有以下按函数在语句中的作用来分,可以有以下3种函数种函数调用方式:调用方式:A.函数语句函数语句把函数调用单独作为一个语句,并不要求函数带回一把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定的操作。个值,只是要求函数完成一定的操作。比如:比如:prin
6、tstar();2022年12月7日14时47分113函数的调用函数的调用B.函数表达式函数表达式函数出现在一个表达式中,这时要求函数带回一个确函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。定的值以参加表达式的运算。比如:比如:c=2*max(a,b);C.函数参数函数参数函数调用作为一个函数的实参。函数调用作为一个函数的实参。比如:比如:m=max(a,max(b,c);/max(b,c)是函数调用,其值作为外层是函数调用,其值作为外层max函数调用函数调用的一个实参的一个实参2022年12月7日14时47分124内置函数内置函数调用函数时需要一定的时间和空间的开销
7、。图2表示函数调用的过程。图2表示函数调用的过程2022年12月7日14时47分134内置函数内置函数C+提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。(1)内置函数定义,这种嵌入到主调函数中的函数称为内置函数内置函数(inline function),又称内嵌函数。(2)声明格式:只需在函数首行的左端加一个关键字inline即可。比如:inline int max(int x,int y);内置函数节省了时间开销,但需要更多的空间。2022年12月7日14时47分145函数的重载函数的重载(1)函数的重载的含义)函数的重载的含义 C+允许用同一
8、函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载函数的重载(function overloading)。在编程时,有时我们要实现的是同一类的功能,只是有些细节不同。2022年12月7日14时47分155函数的重载函数的重载例如:希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数、个整数、3个双个双精度数或精度数或3个长整数个长整数。程序设计者往往会分别设计出3个不同名的函数,其函数原型为:int max1(int a,int b,int c);/求3个整数中的最大者double max2(double a,double b,double c);
9、/求3个双精度数中最大者long max3(long a,long b,long c);/求3个长整数中的最大者2022年12月7日14时47分165函数的重载函数的重载例P12的1.6:求3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。int max(int a,int b,int c);/函数声明 double max(double a,double b,double c);/函数声明 long max(long a,long b,long c);/函数声明采采用用函函数数重重载载2022年12月7日14时47分175函数的重载函数的重载#include using namesp
10、ace std;int main()int max(int a,int b,int c);/函数声明double max(double a,double b,double c);/函数声明long max(long a,long b,long c);/函数声明 int i1,i2,i3,i;cini1i2i3;/输入3个整数 i=max(i1,i2,i3);/求3个整数中的最大者 couti_max=id1d2d3;/输入3个双精度数 d=max(d1,d2,d3);/求3个双精度数中的最大者 coutd_max=dg1g2g3;/输入3个长整数g=max(g1,g2,g3);/求3个长整数中
11、的最大者 coutg_max=ga)a=b;if(ca)a=c;return a;2022年12月7日14时47分195函数的重载函数的重载double max(double a,double b,double c)/定义求3个双精度数中的最大者的函数if(ba)a=b;if(ca)a=c;return a;2022年12月7日14时47分205函数的重载函数的重载long max(long a,long b,long c)/定义求3个长整数中的最大者的函数if(ba)a=b;if(ca)a=c;return a;2022年12月7日14时47分215函数的重载函数的重载运行情况如下:185
12、-76 567 (输入3个整数)56.87 90.23 -3214.78 (输入3个实数)67854 -912456 673456 (输入3个长整数)i_max=567 (输出3个整数的最大值)d_max=90.23 (输出3个双精度数的最大值)g_max=673456 (输出3个长整数的最大值)2022年12月7日14时47分225函数的重载函数的重载上例3个max函数的函数体是相同的,其实重载函数并不要求函数体相同。重载函数除了允许参数类型不同以外,还允许参数的除了允许参数类型不同以外,还允许参数的个数不同。个数不同。参见教材P13的例1.7int max(int a,int b,int
13、c)int max(int a,int b)参数个数不同参数个数不同2022年12月7日14时47分235函数的重载函数的重载注意:(1)重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同;函数返回值类型可以相同也可以不同。(2)在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,使人莫名其妙。2022年12月7日14时47分246函数模板函数模板(1)函数模板)函数模板(function template)的含义的含义所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。
14、这个通用函数就称为函数模板。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。2022年12月7日14时47分256函数模板函数模板定义函数模板的一般形式为定义函数模板的一般形式为:template 通用函数定义通用函数定义 或或 template 通用函数定义通用函数定义类型参数可以不只一个,可以根据需要确定个数。类型参数可以不只一个,可以根据需要确定个数。如:如:template 2022年12月7日14时47分266函数模板函数模板例例P14
15、的的1.8 将例将例1.6程序改为通过函数模板来实现。程序改为通过函数模板来实现。#include using namespace std;template /模板声明,其中T为类型参数T max(T a,T b,T c)/定义一个通用函数,用T作虚拟的类型名if(ba)a=b;if(ca)a=c;return a;2022年12月7日14时47分276函数模板函数模板int main()int i1=185,i2=-76,i3=567,i;double d1=56.87,d2=90.23,d3=-3214.78,d;long g1=67854,g2=-912456,g3=673456,g;i
16、=max(i1,i2,i3);/调用模板函数,此时调用模板函数,此时T被被int取代取代d=max(d1,d2,d3);/调用模板函数,此时调用模板函数,此时T被被double取代取代g=max(g1,g2,g3);/调用模板函数,此时调用模板函数,此时T被被long取代取代 couti_max=iendl;coutf_max=fendl;coutg_max=g1)花花5分钟自己做一分钟自己做一下,只写递归子下,只写递归子程序。程序。2022年12月7日14时47分379函数的递归调用函数的递归调用程序如下:#include using namespace std;long fac(int);
17、/函数声明int main()int n;/n为需要求阶乘的整数long y;/y为存放n!的变量coutn;/输入n y=fac(n);/调用fac函数以求n!coutn!=yendl;/输出n!的值 return 0;long fac(int n)/递归函数long f;if(n0)coutn0,data error!1时,进行递归调用 return f;/将f的值作为函数值返回2022年12月7日14时47分38课后总结课后总结(1)C+对C的函数的扩充,包括:函数的强制声明、函数的重载、有默认参数的函数、函数模板。(2)函数参数的传递。(3)函数的嵌套调用和递归调用。2022年12月7日14时47分39精品课件精品课件!2022年12月7日14时47分40精品课件精品课件!2022年12月7日14时47分41课后作业课后作业P35:9、10 本讲结束本讲结束
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。