四章函数和作用域.ppt
《四章函数和作用域.ppt》由会员分享,可在线阅读,更多相关《四章函数和作用域.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、四章函数和作用域 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望4.1 函数的定义和说明函数的定义和说明一、函数的定义一、函数的定义 ()函数返回值的函数返回值的类型类型4.1 函数的定义和说明函数的定义和说明一、函数的定义一、函数的定义 ()函数的标识函数的标识4.1 函数的定义和说明函数的定义和说明一、函数的定义一、函数的定义包括参数名和参数类型(无形参时,括号不可省)包括参数名和参数类型(无形参时,括号不可省)()函数调用时的函数调用时的形式参数形式参数4.
2、1 函数的定义和说明函数的定义和说明一、函数的定义一、函数的定义 ()函数的具体实现函数的具体实现例:例:int add(int x,int y)int z;z=x+y;return z;void nothing()二、函数的说明(声明)二、函数的说明(声明)函数定义在后、调用在先,调用前必须说明;函数定义在后、调用在先,调用前必须说明;函数定义在先、调用在后,可以不加说明;函数定义在先、调用在后,可以不加说明;复杂调用中,常在程序头对所有被调用函数复杂调用中,常在程序头对所有被调用函数 一次性说明。一次性说明。();例:例:int add(int x,int y);原型说明原型说明例例4.2
3、#include void fun1(),fun2(),fun3();void main()cout“It is in main.”endl;fun2();cout“It is back in main.”endl;void fun1()cout“It is in fun1.”endl;fun3();cout“It is back in fun1.”endl;void fun2()cout“It is in fun2.”endl;fun1();cout“It is back in fun2.”endl;void fun3()cout“It is in fun3.”endl;4.2 函数的调用函
4、数的调用()void main()int a=3;int b=5;int c=add(a,b);/实参与形参个数相等,类型相同实参与形参个数相等,类型相同实参实参函数调用表达式的值是函数调用表达式的值是函数的返回值函数的返回值;函数调用表达式的类型是函数调用表达式的类型是函数的类型函数的类型;v 函数调用通过一个表达式实现:函数调用通过一个表达式实现:return;或或 return;v 函数的返回值通过函数的返回值通过返回语句返回语句实现实现1)的值作为函数的返回值;的值作为函数的返回值;2)的类型自动转换为函数类型;的类型自动转换为函数类型;3)程序执行的控制权转向调用函数;程序执行的控制
5、权转向调用函数;注:无返回值的函数用注:无返回值的函数用“void”说明类型!说明类型!一、函数的传值调用一、函数的传值调用1.传值调用传值调用将实参值拷贝一个副本给对应的形参将实参值拷贝一个副本给对应的形参;形参值的改变不影响实参!形参值的改变不影响实参!实参实参:常量、变量值或表达式值:常量、变量值或表达式值形参形参:变量:变量变量的两种值:变量的两种值:变量本身值变量本身值和和变量地址值变量地址值;传值调用分为:传值调用分为:传值调用传值调用和和传址调用传址调用;例例4.3#include void swap1(int x,int y)int temp;temp=x;x=y;y=temp
6、;/形参值交换形参值交换 cout“x=”x“y=”yendl;void main()int a(5),b(9);swap1(a,b);cout“a=”a“b=”bendl;a=5,b=9x=9,y=5将实参的地址值赋给对应的形参指针,使形将实参的地址值赋给对应的形参指针,使形参指针指向实参;参指针指向实参;通过改变形参所指向的变量值来影响实参!通过改变形参所指向的变量值来影响实参!实参实参:地址值(指针):地址值(指针)形参形参:指针:指针 2.传址调用传址调用一、函数的传值调用一、函数的传值调用 1.传值调用传值调用例例4.4#include void swap2(int*x,int*y)
7、int temp;temp=*x;*x=*y;*y=temp;/形参指针所指向的变量值交换形参指针所指向的变量值交换 cout“x=”*x“y=”*yendl;void main()int a(5),b(9);swap2(&a,&b);cout“a=”a“b=”bendl;a=9,b=5x=9,y=5二、函数的二、函数的引用调用引用调用/C+特色特色将实参变量名赋给对应的形参引用,相当于将实参变量名赋给对应的形参引用,相当于在被调用函数中使用了实参的别名在被调用函数中使用了实参的别名;通过改变引用来通过改变引用来直接直接改变对应的实参值改变对应的实参值;引用调用比传址调用更直接。引用调用比传址
8、调用更直接。形参形参:引用引用实参实参:变量名变量名q引用是引用是变量的别名变量的别名q对引用的操作就是对被引用的变量的操作对引用的操作就是对被引用的变量的操作例例4.5#include void swap3(int&x,int&y)int temp;temp=x;x=y;y=temp;/形参引用值交换形参引用值交换 cout“x=”x“y=”yendl;void main()int a(5),b(9);swap3(a,b);cout“a=”a“b=”bendl;a=9,b=5x=9,y=5形参形参:引用引用实参实参:变量变量4.3 函数的参数函数的参数一、函数参数的求值顺序一、函数参数的求值
9、顺序C+没有规定函数调用时实参的求值顺序,没有规定函数调用时实参的求值顺序,各编译器自行规定;各编译器自行规定;当实参表达式中带有副作用的运算符时,当实参表达式中带有副作用的运算符时,可能产生由于求值顺序不同而造成的二义可能产生由于求值顺序不同而造成的二义性;性;例例4.6#include int add(int x,int y)return x+y;void main()int x(4),y(6);int z=add(+x,x+y);coutzendl;int t=+x;int z=add(t,x+y);二、设置函数参数的默认值二、设置函数参数的默认值1.C+允许在允许在函数说明函数说明或或
10、定义定义时为形参指定时为形参指定默认值;默认值;2.按按从右至左的顺序从右至左的顺序设置参数的默认值;设置参数的默认值;3.函数调用,实参与形参结合时:函数调用,实参与形参结合时:a)若实参数目不足若实参数目不足,则使用形参默认值则使用形参默认值;b)若给定实参值,则使用给定的实参值。若给定实参值,则使用给定的实参值。例例4.7#include void fun(int a=1,int b=3,int c=5)couta=a,b=b,c=cendl;void main()fun();fun(7);fun(7,9);fun(7,9,11);a=1,b=3,c=5a=7,b=3,c=5a=7,b=
11、9,c=5a=7,b=9,c=11默认值默认值函数定义函数定义例例4.8#include int m(8);int add_int(int x,int y=7,int z=m);void main()int a(5),b(15),c(20);int s=add_int(a,b);coutsendl;int add_int(int x,int y,int z)return x+y+z;函数声明函数声明函数定义函数定义281)按按自右至左的顺序自右至左的顺序设置参数的默认值;设置参数的默认值;2)默认参数默认参数在函数声明中提供在函数声明中提供;3)既有函数声明又有函数定义时,定义既有函数声明又有
12、函数定义时,定义中不允许默认参数;中不允许默认参数;例例4.84)如果只有函数定义,默认参数才可以如果只有函数定义,默认参数才可以出现在函数定义中。出现在函数定义中。例例4.7v 设置参数默认值应注意的问题:设置参数默认值应注意的问题:三、使用数组作函数参数三、使用数组作函数参数 1.形参和实参都用数组形参和实参都用数组#includeint a8=1,3,5,7,9,11,13;void fun(int b,int n)for(int i=0;in-1;i+)b7+=bi;void main()int m=8;fun(a,m);couta7endl;例例4.949实参实参形参形参 2.形参和
13、实参都用指针形参和实参都用指针#includeint a8=1,3,5,7,9,11,13;void fun(int*pa,int n)/指针指针pa指向实参数组指向实参数组 for(int i=0;in-1;i+)*(pa+7)+=*(pa+i);void main()int m=8;fun(a,m);couta7endl;例例4.1049实参实参 3.实参用数组名形参用引用实参用数组名形参用引用#includetypedef int array8;/int a8=1,3,5,7,9,11,13;array a=1,3,5,7,9,11,13;void fun(array&b,int n)/
14、为实参数组起为实参数组起别名别名b for(int i=0;in-1;i+)b7+=bi;/对对b操作即对实参数组操作操作即对实参数组操作void main()int m=8;fun(a,m);couta7endl;例例4.1149实参实参4.4 内联函数内联函数一、内联函数的引入一、内联函数的引入1.引入内联函数是为了解决函数调用时的引入内联函数是为了解决函数调用时的效率问题;效率问题;2.编译时,编译时,用内联函数的函数体用内联函数的函数体替换替换内联内联函数的调用表达式函数的调用表达式(一般函数在运行时(一般函数在运行时被调用);被调用);3.内联函数是以目标代码的增加为代价来内联函数是
15、以目标代码的增加为代价来换取时间的节省。换取时间的节省。二、内联函数的定义二、内联函数的定义 inline ()#include inline int power(int x)return (x)*(x);void main()for(int i=1;i=10;i+)int p=power(i);couti“*”i“=”pendl;例例4.121.内联函数的内联函数的定义定义必须必须出现在出现在内联函数内联函数第一次被调用第一次被调用前前;2.内联函数体内内联函数体内不允许不允许用用循环语句循环语句和和开开关语句关语句;3.类结构中所有在类说明内部定义的函类结构中所有在类说明内部定义的函数都是
16、内联函数。数都是内联函数。v 使用内联函数时应注意:使用内联函数时应注意:4.5 函数重载函数重载函数重载是指函数重载是指同一函数名同一函数名对应对应多个函数多个函数实现实现;函数重载时,要求同名函数在函数重载时,要求同名函数在参数个数参数个数上不同,上不同,或或参数类型上不同参数类型上不同;函数调用时,系统函数调用时,系统根据根据调用函数的调用函数的实参实参情况选择某个函数实现情况选择某个函数实现。一、参数类型不同的函数重载一、参数类型不同的函数重载#include int add(int,int);double add(double,double);void main()coutadd(5
17、,10)endl;coutadd(5.0,10.5)endl;int add(int x,int y)return x+y;double add(double a,double b)return a+b;例例4.13二、参数个数不同的函数重载二、参数个数不同的函数重载#include int min(int a,int b)return ab?a:b;int min(int a,int b,int c)int t=min(a,b);return min(t,c);void main()coutmin(5,4,9)endl;coutmin(-2,0)endl;例例4.144.6 函数的嵌套和递归
18、调用函数的嵌套和递归调用一、函数的嵌套调用一、函数的嵌套调用 main函数函数调用调用a函数函数结束结束 b函数函数 a函数函数调用调用b函数函数q在调用一个函数的过程中,又调用另一个函数在调用一个函数的过程中,又调用另一个函数例例4.15#includeconst int k=4,n=6;int sum(int k,int n),powers(int m,int n);void main()coutsum(k,n)endl;int sum(int k,int n)/求求n个数的个数的k次幂之和次幂之和 for(int i=1,sum=0;i=n;i+)sum+=powers(i,k);ret
19、urn sum;int powers(int i,int k)/求求i的的k次幂次幂 for(int j=1,p=1;j=k;j+)p*=i;return p;二、函数的递归调用二、函数的递归调用调用一个函数的过程中又调用一个函数的过程中又直接直接或或间接间接地地调调用该函数自身用该函数自身;1.含义含义2.特点特点1)每次分解出的每次分解出的新问题是原问题的简化新问题是原问题的简化的的子问题;子问题;2)最终分解出最终分解出的新问题是一个的新问题是一个已知解已知解;3)程序简洁清晰,可读性强;程序简洁清晰,可读性强;3.过程过程q回归回归:从已知条件出发,:从已知条件出发,逐一求值回归逐一求
20、值回归,最终达递推开始处;最终达递推开始处;q递推递推:原问题不断:原问题不断分解为新的子问题分解为新的子问题,最终达递归结束条件最终达递归结束条件(已知已知);0!=1(已知已知)3!=3*2!2!=2*1!1!=1*0!递推递推递推递推递推递推1!=1*1=12!=2*1!=2*1=23!=3*2!=3*2=6回归回归回归回归回归回归例:例:例例4.16#include long int fac(int n);void main()int n;coutn;long fa=fac(n);coutn!=faendl;long int fac(int n)long int p;if(n=0)p=
21、1;else p=n*fac(n-1);return p;例例4.17#include const int N=8;long fibo(int n);void main()long f=fibo(N);coutfendl;long fibo(int n)if(n=1)return 0;else if(n=2)return 1;else return fibo(n-1)+fibo(n-2);4.7 作用域作用域一、标识符的作用域规则一、标识符的作用域规则1.标识符只能标识符只能在在其其说明或定义的范围内可见说明或定义的范围内可见,在该范围之外不可见!在该范围之外不可见!2.“可见可见”即可以进行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 作用
限制150内