第4章 函数和预处理PPT讲稿.ppt
《第4章 函数和预处理PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第4章 函数和预处理PPT讲稿.ppt(83页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章章 函数和预处理函数和预处理第1页,共83页,编辑于2022年,星期一目录目录4.1 函数的概述4.2 函数的定义和调用4.3 函数的参数传递4.4 内联函数4.5 递归函数4.6 函数重载4.7 作用域4.8 文件与预编译命令第2页,共83页,编辑于2022年,星期一调用函数1调用函数2.函数1 函数2图图4.1 4.1 函数调用图函数调用图4.1函数概述函数概述 当一个程序在调用某个函数时,当一个程序在调用某个函数时,当一个程序在调用某个函数时,当一个程序在调用某个函数时,c+c+自动转到被调用的函数中执行,自动转到被调用的函数中执行,自动转到被调用的函数中执行,自动转到被调用的函
2、数中执行,执行完后再回到原先程序执行的位置,继续执行下一条语句。执行完后再回到原先程序执行的位置,继续执行下一条语句。执行完后再回到原先程序执行的位置,继续执行下一条语句。执行完后再回到原先程序执行的位置,继续执行下一条语句。目录目录第3页,共83页,编辑于2022年,星期一4.2 函数定义和调用函数定义和调用函数定义函数定义在使用函数时,要先对函数进行定义,确定它要实现的功能。函数调用函数调用 函数的使用就是调用函数的过程。第4页,共83页,编辑于2022年,星期一4.2.1 函数定义函数定义形式如下:()函数体;函数名是有效c+标识符,其后必须跟(),以区别于变量名及其他用户定义的标识名。
3、即函数的返回值类型,若不需要函数有返回值,则定义函数的类型为void即可。各参数以逗号隔开,每个参数由参数类型和参数名表示。参数个数可以为,但圆括号不能省略。由 括起来的若干条语句组成,实现这个函数执行的功能。注:注:C+不允许在一个函数体中再不允许在一个函数体中再定义另一个函数定义另一个函数第5页,共83页,编辑于2022年,星期一函数返回值函数返回值int max(int x,int y)return (xy?x:y);/返回整型 函数返回值语法 return;将return后面的值作为函数返回值,类型同函数定义处的类型相匹配第6页,共83页,编辑于2022年,星期一注意:注意:若函数类型
4、为void,函数体中就不需要return或者return的后面什么也没有 例:无返回值函数void max(int x,int y)couty?x:y);/无return 一旦执行return语句,函数体return后的语句不再执行例:求负数绝对值int abb(int x)if(x0)return x;cout“this is负数”;return x;第7页,共83页,编辑于2022年,星期一4.2.2 函数调用函数调用调用函数的一般形式如下:()实际参数与形参相对应,它是实际调用函数时所给定的常量,变量或表达式,且必须有确定的值。一般地,仅当函数被调用时,系统才会给形参分配内存单元,而调用
5、结束后,形参所占用的内存单元又被释放。第8页,共83页,编辑于2022年,星期一例例:输输入入两两个个实实数数,输输出出其其中中较较大大的的数数。其其中中求求两两个个实实数数中中的的较较大大数数用函数完成。用函数完成。#includefloat max(float x,float y)return(x=y?x:y);void main()float x,y;cout输入两个实数:输入两个实数:xy;coutx和和y中较大数为中较大数为max(x,y)endl;main()函函数数调用调用max(2.5,4.7)函数函数max(2.5,4.7)return 4.7 主程序后续主程序后续语句语句第
6、9页,共83页,编辑于2022年,星期一实参与形参的个数相等,类型一致,且顺序一致实参与形参的个数相等,类型一致,且顺序一致函数调用方式:函数调用方式:1.作为一个语句不使用返回值作为一个语句不使用返回值 max(3,4);/只是要求函数完成一定的操作2.作为表达式的一部分作为表达式的一部分int c=5*max(2,10);/将返回值参与运算,结果c=503.作为函数的实参作为函数的实参int c=2;c=max(max(c,4),10);/等价于c=max(max(2,4),10),最后结果为c=10目录目录第10页,共83页,编辑于2022年,星期一4.2.3函数的说明函数的说明背景:函
7、数必须先定义后调用用途:若函数定义在后而调用在前,需在调用前进行“函数的说明”。函数说明的格式:();形参的变量名可以省略。但要注意,函数说明的内容应与函形参的变量名可以省略。但要注意,函数说明的内容应与函数的定义相同。必须有分号!数的定义相同。必须有分号!例:int max(int x,int y);或int max(int,int);第11页,共83页,编辑于2022年,星期一例例:输输入入两两个个实实数数,输输出出其其中中较较大大的的数数。其其中中求求两两个个实实数数中中的的较较大大数数用函数完成。用函数完成。#includefloat max(float,float);/说明以分号结尾
8、说明以分号结尾void main()float x,y;cout输入两个实数:输入两个实数:xy;coutx和和y中较大数为中较大数为max(x,y)=y?x:y);目录目录第12页,共83页,编辑于2022年,星期一4.3函数的参数传递函数的参数传递参数类型检查C+参数的传递方式:按值传递地址或引用传递第13页,共83页,编辑于2022年,星期一1.按值传递按值传递参数传递的缺省初始化方式是把实参的值拷贝到形参的存储区。函数本身不对实参进行操作,只是处理的实参的本地拷贝。也就是说,即使形参的值在函数中发生了变化,实参的值不会受到影响。第14页,共83页,编辑于2022年,星期一#includ
9、evoid swap(int x,int y)int temp=x;x=y;y=temp;void main()int a=2,b=10;swap(a,b);couta=a,b=b;cout引用在声明时必须初始化引用在声明时必须初始化引用的声明形式:&引用名=变量名int a,b=10;int&i=a;i=5;i=b;注意:引用仅在说明的时候带&,之后就象普通变量一样使用,不再带&对引用的操作实际是对其引用的变量的操作引用一旦声明,就不能再成为其他变量的别名引用不是变量,它不占存储空间,它与被引用的变量有同存储地址引用不是指针,不能动态分配内存a,i第16页,共83页,编辑于2022年,星期一
10、一个函数能使用引用传递方式是在函数定义时将形参前面加一个函数能使用引用传递方式是在函数定义时将形参前面加上引用运算符上引用运算符“&”。例如:例如:void swap(int&x,int&y)第17页,共83页,编辑于2022年,星期一#includevoid swap(int&x,int&y)int temp=x;x=y;y=temp;void main()int a=2,b=10;swap(a,b);cout a=a,b=b endl;函数函数swap中的中的int&x和和int&y就是形参的引用就是形参的引用说明。说明。在执行在执行swap(a,b)时,时,x、y相当于相当于a、b的别名
11、,的别名,对引用的操作实际是对其引用的变量的操作,因此对形参形参x,y任何操作都会改变相应的实参任何操作都会改变相应的实参a,b的数据。的数据。所以所以swap调用后调用后a和和b的值交换的值交换本程序执行结果如下:本程序执行结果如下:a=10 b=2第18页,共83页,编辑于2022年,星期一引用适用于:需要改变参数值的函数接受大类型对象做参数的函数当一个函数返回个引用时,它可成为左值。结构体或对象第19页,共83页,编辑于2022年,星期一3.地址传递地址传递函数定义时将形参说明成指针。int n=1;/n的内容为1int*p=&n;/p为整型指针变量,其内容是n的地址*p表示p指向的整型
12、变量的值;调用函数时需要指定地址值形式的实参。通过改变形参(指针)指向的变量来影响实参。存放变量的地址第20页,共83页,编辑于2022年,星期一#includevoid swap(int*x,int*y)int temp=*x;*x=*y;*y=temp;void main()int a=2,b=10;swap(&a,&b);cout a=a,b=b endl;结果:结果:a=10,b=22(*x)10(*y)0 x000E0 x001E0 x000E a a0 x001E b bx xy y地址地址内容内容变量名变量名10102 2第21页,共83页,编辑于2022年,星期一参数传递的总结
13、参数传递的总结值传递值传递引用和地址传递引用和地址传递改变实参副本(拷走)改变实参本身(操作)第22页,共83页,编辑于2022年,星期一4函数的默认参数值函数的默认参数值C+允许在函数的说明或定义时给一个或多个参数指定默认值。这样在调用时可以不给出参数,而按指定的默认值进行工作。定义void initialize(int printNO,void initialize(int printNO,int state=0int state=0)调用initialize(1);/打印机状态缺省为0initialize(1,0);/传递打印机状态参数0initialize(1,1);第23页,共83页
14、,编辑于2022年,星期一1.函数可以将其全部或部分参数定义为带默认值,但带默认值的参数只能放在参数表的最后 例:以下函数定义不正确:void f(int par1=1,int par2,int par3=3)void f(int par1=1,int par2=2,int par3)因为系统按从前往后的顺序进行参数匹配若中间参数有默认值,无法判断哪些参数使用默认值f(5);f(3,6);f(2,3,4);注意:第24页,共83页,编辑于2022年,星期一注意2函数既有定义又有说明时,一般函数既有定义又有说明时,一般说明中说明中给出给出默认形参值。默认形参值。void initialize(i
15、nt printNO,int state=0);同一作用域同一作用域中,函数某一参数的中,函数某一参数的默认值默认值只能只能说明一次说明一次void initialize(int printNO,int state=0);void initialize(int printNO,int state=1);/错!在同一全局作用域内重复说明 /state默认值void main()void initialize(int printNO,int state=1);/可以!在不同作用域内void initialize(int printNO,int state)第25页,共83页,编辑于2022年,星期
16、一程序还可以通过重新定义函数原型使本来不带默认值的参数带上默认值,这是使通用函数特定化例:以下声明合法:(同一作用域)void initialize(int printNO,int state=0);void initialize(int printNO=1,int state);/对!重新定义printNO的默认值注意3第26页,共83页,编辑于2022年,星期一#include void initialize(int printNO,int state=0);void initialize(int printNO=1,int state);/重新定义重新定义 printNO的默认值的默认值
17、void main()initialize();initialize(0);initialize(1,1);void initialize(int printNO,int state)cout “printNO=”printNO“,”;cout“state”state endl;本程序的运行结果如下本程序的运行结果如下 ptintNO=1,state=0 ptintNO=0,state=0 ptintNO=1,state=1第27页,共83页,编辑于2022年,星期一函数调用机制函数调用机制main().调调func().保存:返回地址保存:返回地址当前现场当前现场恢复:主调函数现场恢复:主调
18、函数现场返回地址返回地址void func().目录目录第28页,共83页,编辑于2022年,星期一4.4 作用域作用域作用域(讨论标识符的有效范围)作用域(讨论标识符的有效范围)变量的作用域是指程序中变量有效的区域。分为三类:文件域局部域类域。第29页,共83页,编辑于2022年,星期一#includeint global;void f(int par)int flocal;if(global)int blocal;blocal=par;blocal=1;flocal=1;global=1;void main()int local=2;f(local);global/全局变量全局变量loca
19、lparflocalblocal全局变量全局变量全局域定义的变全局域定义的变量(定义在所有量(定义在所有函数之外的变量)函数之外的变量)局部变量局部变量函数、块中定义函数、块中定义的变量的变量局部变量局部变量global作用域flocal作用域作用域blocal作用域作用域local作用域作用域第30页,共83页,编辑于2022年,星期一注意注意同一作用域,不能声明同名的标志符不同作用域的标识符可以重名,但是具有包含关系的作用域中,局部变量会隐藏局部变量会隐藏同名全全局变量局变量在没有互相包含关系的作用域中,声明的标志符互不影响具有包含关系的作用域中声明了同名标志符,则外层标志符在内层不可见(
20、局部变量可隐藏同名全局变量)第31页,共83页,编辑于2022年,星期一#include int n=1;/n为全局变量为全局变量 void Fun()int n=10;/n为函数内局部变量为函数内局部变量 cout“Fun:n=”n 0)int n=5;/n为块内局部变量为块内局部变量,掩盖了全局的掩盖了全局的n cout“Block:n=”n endl;cout“Main:n=”n endl;/n为全局变量为全局变量 Fun:n=10Block:n=5Main:n=2第32页,共83页,编辑于2022年,星期一4.4.1 域运算符域运算符:背景:背景:局部变量可隐藏全局变量,在有同名全局和
21、局部变量的情形时如何访问全局变量呢?域运算符域运算符“:”提供对全局变量的访问。提供对全局变量的访问。以以域运算符为前缀的变量表示全局变量。域运算符为前缀的变量表示全局变量。例如,下面程序中有两个变量同名,一个为全局变量,一个为局部变量,例如,下面程序中有两个变量同名,一个为全局变量,一个为局部变量,可以通过域运算符访问全局变量可以通过域运算符访问全局变量:int var=10;/全局变量全局变量func()int var;/局部变量局部变量 var=:var;/将全局变量的值赋给局部变量将全局变量的值赋给局部变量第33页,共83页,编辑于2022年,星期一 例:银行还贷计算例:银行还贷计算#
22、include float lv=0.062;/央行房贷利率上限央行房贷利率上限 float count(float loan,float ratio)float lv=:lv*ratio;/各个银行重新计算自己的利率各个银行重新计算自己的利率 return loan*(1+lv);int main()float loan;float gh_ratio;/0.9float zh_ratio;/0.8coutloan;/10000coutgh_ratio;coutzh_ratio;cout工行本月还贷:工行本月还贷:count(loan,gh_ratio)endl;cout中行本月还贷:中行本月
23、还贷:count(loan,zh_ratio);贷款总额贷款总额10000工行执行:工行执行:0.8中行执行:中行执行:0.9工行本月还贷:工行本月还贷:10496中行本月还贷:中行本月还贷:10558第34页,共83页,编辑于2022年,星期一4.4.2 变量的存储类型变量的存储类型从变量的存储角度看,有四种存储类型静态变量外部变量自动变量寄存器变量。说明格式:存储类型决定了变量的生存期存储类型决定了变量的生存期!第35页,共83页,编辑于2022年,星期一1 静态变量静态变量(static)-引子引子作用域作用域VS。生存期生存期作用域:该变量可以被引用的范围生存期:从变量定义且被分配内存
24、开始,直到相应内存被释放为止变量的生存期变量的生存期(存储空间)(存储空间)可以是永久的(即在程序运行期间该变量一直存在)也可以是暂时的(即变量在程序运行到达其作用域时才会产生,而作用域结束时,变量也随之消亡)作用域与生存期作用域与生存期一般一般是对应的是对应的全局变量是永久的:在程序运行的过程中一直存在;局部变量大多是临时的:只在说明它们的作用域内发挥作用,一旦程序控制离开了这一作用域,这些局部变量所占空间就会释放。二者交叉二者交叉static第36页,共83页,编辑于2022年,星期一静态局部变量既有在局部作用域的特性(即变量只能在变量作用的范围内被访问),又可以永久存在。声明方式:在变量
25、定义前加上static标记。static int local;第37页,共83页,编辑于2022年,星期一 例:例:/银行进门排队发号银行进门排队发号#include int welcome()static int counter=0;counter+;coutwelcome!You are counterch;/Q或或q为结束为结束while(ch!=Q&ch!=q)welcome();cinch;/Q或或q为结束为结束 ewelcome!You are 1vwelcome!You are 2q第38页,共83页,编辑于2022年,星期一静态局部变量静态局部变量VS.局部变量局部变量分配空间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 函数和预处理PPT讲稿 函数 预处理 PPT 讲稿
限制150内