C程序设计第5章函数.ppt
《C程序设计第5章函数.ppt》由会员分享,可在线阅读,更多相关《C程序设计第5章函数.ppt(79页珍藏版)》请在三一办公上搜索。
1、第五讲 函数,2,本章内容提要:,函数概述内联函数带默认参数值的函数函数重载作用域与存储类型系统函数,C+语言程序设计,函数,函数,#includeint square(int x)/函数定义 return x*x;void main()int x,y;coutx;y=square(x);/函数调用 coutsquare=yendl;,注:C+源程序都是由若干个函数组成的,每个函数完成一定的功能。运行时,程序总是从主函数main()开始执行,其他函数由main()函数或别的函数调用后执行,最后到main()函数终止运行。,4,5.1 函数的定义与声明,函数是C+程序的基本单元,是组成模块。一个
2、C+程序是由若干个源程序文件构成的,而一个源程序文件是由若干个函数构成。函数类型从用户的角度看,有两种不同的函数:库函数用户自定义函数库函数也称标准函数,由C+系统提供。用户自定义函数则需要用户先定义,后使用。,函数,5,5.1.1函数的定义,函数的定义格式定义函数的一般形式:函数返回值的数据类型标识符 函数名(形式参数表及其类型)函数体,函数,void display_larger(int x,int y)if(xy)coutThe larger is:xn;else coutTwo values are equal.n;,6,5.1.1函数的定义,在C+中定义函数时注意:函数的形参及类型说
3、明要采用新的ANSI标准,即必须放在函数名后面的括号内。当形参有多个时,必须用逗号隔开。如果函数是无参函数,括号也不能省略。所有的函数都要先定义,后使用(调用)。不能省略函数值的类型,必须表明该函数的函数值的类型,即使该函数没有返回值,也要注明函数值的类型为void。,函数,5.1.2 函数的声明,函数声明也称函数模型或函数原型。函数声明的一般格式为:函数类型名 函数名(形式参数表);例如:设有一函数定义为float fun(char a,int b,float c)函数体,函数,则对fun函数的声明为:float fun(char m,int n,float i);/末尾要加上分号,5.1.
4、2 函数的声明,关于函数声明的几点说明:函数必须先声明(或定义)后使用。必须确保函数声明语句与函数调用表达式出现在同一个文件中。虽然函数声明与函数头相似,但是它们之间也有细微的差别。如,float fun(char,int,float);函数声明中当函数返回值类型为int或char时函数类型可以省略,一般情况下不能省略函数类型。函数声明中形参的次序不能写错。函数定义在调用前,函数声明可以省略。,函数,可以把例5.1改写为如下形式:#includeint square(int x);/声明语句void main()int x,y;coutx;y=square(x);/调用语句 coutsquar
5、e=yendl;int square(int x)/函数定义 return x*x;,9,函数的定义与声明的区别,函数的定义与声明的区别函数的“定义”是一个函数功能的确立,包括指定函数名,函数返回值的类型,形参及其类型,函数体等,它是一个完整的、独立的函数单位。函数的“声明”则只是对已经定义好的函数的接口进行的说明,它包括函数名,函数类型,形参的类型。不包括形参名和函数体。对函数进行声明的作用是告诉编译系统,在本程序中将要用到的函数是什么类型,参数的个数和类型,以便在主调函数中正确使用函数。,函数,10,5.2函数的调用,调用函数所谓调用函数是指在程序中使用了该函数。函数调用时,中断现行函数(
6、主调用函数),程序的执行流程转向被调用函数的入口。开始执行被调函数。遇到return或返回主调函数。相关的概念主调函数、被调函数、调用点函数调用的格式函数名(实参表)说明如果调用的是无参函数,则实参表可略去,但函数的括号不能省。如果实参表中有多个参数,参数之间用逗号隔开,实参的类型、个数应与形参一一对应。,函数,程序开始点,程序结束点,11,1.形参和实参,形式参数和实际参数(形参和实参)在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。而函数之间的数据传递途径之一就是靠函数的参数进行的。在定义函数时,函数名后面括号内的变量名为“形式参数”(形参)。在调用函数时,函数名后面括号
7、内的表达式为“实际参数”(实参)。实参与形参个数相等,类型一致,按顺序一一对应。用实际参数向形式参数传递数据。,函数,12,1.形参和实参,举例,函数,#include int max(int,int);void main()int a,b,c;cinab;c=max(a,b);coutmax is cendl;,int max(int x,int y)int z;z=xy?x:y;return z;,实参,形参,13,1.形参和实参,关于形参和实参的几点说明实参可以是变量、常量、或表达式,但必须有确定的值。而形参必须是变量。形参变量,只有存在发生函数调用时,形参才被分配存储单元,在调用结束时
8、,形参所占的内存单元被释放。实参与形参的类型必须一致,否则会发生“类型不匹配”的错误。实参对形参的数据传递是“值传递”,即单向传递。由实参把数据传给形参,并且存储单元与形参是不同的单元。调用结束后,形参单元被释放,而实参单元保留并维持原值。,函数,14,2.函数的返回值,函数的返回值是通过函数中的return语句“返回”的。return语句的格式为:return(表达式);或return 表达式;return语句的功能有两个:强制程序执行的流程从被调函数返回到主调函数。给主调函数带回一个确定的函数值。举例,函数,int max(int a,int b)return(ab?a:b);,15,2.
9、函数的返回值,函数返回值的类型函数返回值的类型就是在定义函数时的函数的类型。在定义函数时,函数的类型和return语句中的表达式类型不一致时,则以函数类型为准。如果被调用函数中没有return语句,为了明确表示函数“不返回值”,要用void定义无类型。举例这样系统就保证不使函数带回任何值。,函数,void print()printf(c language);,16,3.函数调用的形式,函数通过下列三种方式完成函数调用:函数调用语句在一个函数调用的后面加上“;”作为一条语句。如:printf();函数表达式即函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如:c=2*ma
10、x(a,b);函数参数以函数的调用作为一个函数的实参。如:m=max(a,max(b,c);,函数,4.函数的调用方式,一个函数被定义后就是为了将来对其调用。调用函数是实现函数功能的手段。正确的数据传递是正确使用函数的前提,C+语言采用函数的形式参数(形参)和实际参数(实参)实现函数间的数据传递。C+中函数的调用方式:赋值调用传递变量值的传值调用传递变量地址值的传址调用引用调用,main()int a,b,c;cinab;c=max(a,b);couty?x:y;return(z);,4.函数的调用方式,例 比较两个数并输出大者,c=max(a,b);,max(int x,int y)int
11、z;z=xy?x:y;return(z);,形参,实参,(1)函数的传值调用,也称为值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递实参可以是常量、变量或表达式,但必须有确定的值。,例5.2,问题使用传值调用方式完成两整数交换。,#includevoid change(int a,int b)int temp;temp=a;a=b;b=temp;couta=a,”b=bendl;void main()int x=0;int y=1;change(x,y);coutx=x,y=yen
12、dl;,a=1,b=0 x=0,y=1,值传递调用演示,(2)函数的传址调用,调用函数的实参地址值,被调用函数的形参用指针。调用时系统将实参的地址值赋给对应的形参指针,使形参指针指向实参变量。传址调用的特点是可以通过改变形参所指向的变量值来影响实参。,例5.3,问题使用传址调用方式完成两整数交换。,#includevoid change1(int*a,int*b)int temp;temp=*a;*a=*b;*b=temp;couta=*a,b=*bendl;void main()int x=0;int y=1;change1(,a=1,b=0 x=1,y=0,址传递调用演示,调用:,a,b,
13、形参a:,形参b:,5,9,实参x:,实参y:,(3)函数的引用调用,在函数定义时,函数的参数(形参)可以说明为引用类型,这样在函数的调用过程中,实参与形参的结合就属于引用调用。引用主要用于函数的形参和返回值。对形参引用的改变,实质就是直接地通过引用(实参的别名)来改变实参的变量值。这种调用也起到了传址调用的作用,但更直接、方便。注意:引用调用方式中,实参用变量名,形参用引用,调用时将实参的变量名赋给对应的形参引用。在被调用函数中,改变引用的值就直接改变了对应的实参值。尽量避免使用传址方式来传递参数。,例5.4,问题使用引用调用方式完成两整数交换。,#includevoid change2(i
14、nt,a=1,b=0 x=1,y=0,5.函数的参数,(1)设置函数参数的默认值C中,允许在函数的说明或定义时给一个或多个参数指定默认值。但是,要求在一个指定了默认值的参数右边,不能出现没有指定默认值的参数。int add_int(int x,int y=10);在函数调用时,编译器按从左至右的顺序将实参与形参结合,当实参的数目不足时,编译器将按同样的顺序用说明中或定义中的默认值为补遗缺少的实参。add_int(15);等价于add_int(15,10);给某个参数指定默认值时,不仅可以是一个数值,而且还可以是任意复杂的表达式。例5.5 设置默认参数值函数,5.函数的参数,(2)使用数组作函数
15、参数数组作函数参数可分为三种情况:形参和实参都用数组名、形参和实参都用对应数组的指针、实参用数组名形参用引用。三种情况的结果相同,只是所采用的调用机制不同形参和实参都用数组 例5.6 形参和实参共用内存中同一个数组。在被调用函数中改变了数组中某个元素的值,对调用函数该数组的该元素的值也被改变。形参和实参都用对应数组的指针 例5.7 数组名规定是一个指针常量,所以在使用指针时,可以用数组名,也可以用另外定义的指向数组的指针。实参用数组名形参用引用 例5.8 对数组类型使用引用方式,先要用类型定义语句定义一个数组类型;然后再用新定义的类型别名来定义数组和引用。,29,5.3内联函数,内联函数内联函
16、数的定义方法和格式:inline 函数值的类型 函数名(形参表)函数体举例,函数,void main()double x;coutx;coutthe squre is square(x)endl;,#include inline double square(double x)return x*x;,30,5.3内联函数,内联函数与普通函数的区别和联系在定义内联函数时,函数值的类型左面有“inline”关键字,而普通函数在定义时没有此关键字。程序中调用内联函数与调用普通函数的方法相同。当在程序中调用一个内联函数时,是将该函数的代码直接插入到调用点,然后执行该段代码,所以在调用过程中不存在程序流程
17、的跳转和返回问题。从调用机理看,内联函数可加快程序代码的执行速度和效率,但这是以增加程序代码为代价来求得速度的。,函数,31,5.3内联函数,对内联函数的限制应注意:不是任何一个函数都可定义成内联函数。内联函数的函数体内不能含有复杂的结构控制语句,如:switch和while,如果内联函数的函数体内有这些语句,则编译器将该函数视同普通函数那样产生函数调用代码。递归函数不能被用来作为内联函数。内联函数一般适合于只有15条语句的小函数,对一个含有很多语句的大函数,没有必要使用内联函数来实现。,函数,32,5.4函数重载,函数重载函数重载是指一个函数可以和同一作用域中的其他函数具有相同的名字,但这些
18、同名函数的特征标(参数类型、参数个数)、返回值类型、函数功能可以完全不同。举例,函数,#include void whatitis(int i)coutthis is integer:iendl;void whatitis(char c)coutthis is string:cendl;,void main()int i=1;char c=abcdef;whatitis(i);whatitis(c);,33,5.4函数重载,为什么要使用函数重载在C语言中,每个函数必须有其唯一的名称,这样的缺点是所有具有相同功能、而只是函数参数不一样的函数,就必须用一个不同的名称。而C+中采用了函数重载后,对于
19、具有同一功能的函数,如果只是由于函数参数类型不一样,则可以定义相同名称的函数。,函数,34,5.4函数重载,匹配重载函数的顺序由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。具体来说,按以下步骤找到并调用那个函数:寻找一个严格的匹配。即:调用与实参的数据类型、个数完全相同的那个函数。通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C+系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由
20、程序员对实参进行强制类型转换,以此作为查找相匹配的函数的依据。,函数,35,5.4函数重载,匹配重载函数的顺序由于重载函数具有相同的函数名,在进行函数调用时,系统一般按照调用函数时的参数个数、类型和顺序来确定被调用的函数。具体来说,按以下步骤找到并调用那个函数:寻找一个严格的匹配。即:调用与实参的数据类型、个数完全相同的那个函数。通过内部转换寻求一个匹配。即:通过(1)的方法没有找到相匹配的函数时,则由C+系统对实参的数据类型进行内部转换,转换完毕后,如果有匹配的函数存在,则执行该函数。通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,就调用那个函数。即:在函数调用处由程序员对实参进行
21、强制类型转换,以此作为查找相匹配的函数的依据。,函数,36,5.4函数重载,重载函数举例,函数,#include void print(double d)coutthis is a double:dendl;void print(int i)coutthis is an integer:iendl;/void print(char c)/coutthis is a character:cendl;void main()int x=1,z=10;float y=1.0;char c=a;,/按规则(1)自动匹配函数void print(int i)print(x);/按规则(2)通过内部转换匹配
22、函数void print(double i)/因为系统能自动将float型转换成double型 print(y);/按规则(2)通过内部转换匹配函数void print(int i)/因为系统能自动将char型转换成int型 print(c);/按规则(3)匹配void print(double i)/因为程序中将实参z强制转换为double型。print(double(z);,this is an integer:1this is a double:1this is an integer:97this is a double:10Press any key to continue,this
23、is an integer:1this is a double:1this is a character:athis is a double:10Press any key to continue,37,5.4函数重载,定义重载函数时的注意事项重载函数间不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。这种重载就是错误的。强烈建议:应使所有的重载函数的功能相同。如果让重载函数完成不同的功能,会破坏程序的可读性。,函数,void myfun(int i)int myfun(int i),38,5.5函数的嵌套调用和递归调用,函数的嵌套调用C+语言中函数的定义是平行的、独
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 函数
链接地址:https://www.31ppt.com/p-5336447.html