版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 利用函数实现指定功能.4.1 概述函数是程序代码的一个自包含单元,用于完成某一特定的义务。C+是由函数构成的,函数是C+的根本模块。在c+面向对象程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以经过类对象调用类中的函数.几点阐明1、一个程序必需有且只需一个main( )函数,C+从main( )函数开场执行。2、C+言语中,一切函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。.3、库函数是C+编译系统已预定义的函数库函数有很多个,当用户运用任一库函数时,在程序中必需包含相应的头文件。 如 #include等.4.2 函数定义的普通方式一、
2、无参函数主调函数并不将数据传给被调函数。类型阐明 函数名void 函数体 无参函数主要用于完成某一操作。参数多个函数值(独一函数体不传送参数.void main(void ) printstar ( ); print_message ( ); printstar( );void printstar (void ) cout“* * * * * * * * * * *n; void print_message (void) couty)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a , b) ; cout“The
3、max is cendl; ab23c3xy23z3.4.3关于函数参数和函数的值1、形参是被调函数中的变量;实参是主调函数赋给被调函数的特定值。在调用时实参必需是一个确定的值。2、形参与实参类型一样,一一对应。3、形参必需求定义类型,由于在定义被调函数时,不知道详细要操作什么数,而定义的是要操作什么类型的数。.4、实参对形参变量的传送是“值传送,即单向传送。在内存中实参、形参分占不同的单元。5、形参只作用于被调函数,可以在别的函数中运用一样的变量名。5a8b实参xy形参58.void fun(int a, int b) a=a*10; b=b+a; coutatbendl;void main
4、(void) int a=2, b=3; fun(a,b); coutatby) return x ; else return y; 假设函数体内没有return语句,就不断执行到函数体的末尾,然后前往到主调函数的调用途。先计算,后前往可以有多个return语句.float max(float x, float y) float z; z=(xy)? x : y ; return z; void main (void) float a,b, c; cinab; c=max (a+b , a*b) ; cout“The max iscendl; 被调函数先定义定义之后再调用形参必需阐明参数类型实
5、参传送的是一个详细的值,不用阐明参数类型举例函数的调用例4.3.void main(void ) int x=2,y=3, z=0;void add(int,int,int); cout“(1) x=“x“ y=“y“ z=“zendl; add (x, y, z); cout (“(3) x=“x“ y=“y“ z=“zendl;void add ( int x, int y, int z) z=x+y; x=x*x; y=y*y; cout(“(2) x=“x“ y=“y“ z=“zendl;2x3y0zxyz230495(1) x=2 y=3 z=0(2) x=4 y=9 z=5(3)
6、x=2 y=3 z=0.1、计算100200之间的素数,用函数prime( )判别一个数能否是素数,假设是该函数前往1,否那么前往0。举例.void main(void) for(int i=100;i=200; i+) if(prime(i)=1) coutit; int prime(int x)for(int i=2;ixy; coutgys(x,y)endl;int gys(int a, int b) int r; if(ab)r=a; a=b; b=r; while(r=a%b) a=b; b=r; return b; .4.4函数的嵌套调用C+言语中含C言语,一切函数都是平行独立的,
7、无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。.int power(int m,int n)/mnint i,product=m;for(i=1;in;i+)product=product*m;return product;int sum_of_power(int k,int n)/nk的累加和int i,sum=0;for(i=1;ikm;coutf(k,m)=sum_of_power(k,m)1int age ( int n ) int c; c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)1.float
8、 fac (int n) float y; if (n= =0)| (n= =1) y=1; else y=n*fac(n-1); return y;void main (void) float y; int n; coutn ; coutn“!=fac(n)endl;fac (5)n=5y=5*fac (4)fac (4)n=4y=4*fac (3)fac (3)n=3y=3*fac (2)fac (2)n=2y=2*fac (1)fac (1)n=1y=1return yreturn yy=2return yy=6return yy=24return yy=120.4.6有关作用域和存储类
9、作用域是指程序中所阐明的标识符在哪一个区间内有效,即在哪一个区间内可以运用或援用该标识符。在C+中,作用域共分为五类:块作用域、文件作用域、函数原型作用域、函数作用域和类的作用域。 .一、块作用域我们把用花括号括起来的一部分程序称为一个块。在块内阐明的标识符,只能在该块内援用.float f1( int a) int b,c; .float f2( int x, int y) int i, j; .void main(void ) int m, n; .x,y,i,j 有效a,b,c有效m,n有效.留意:具有块作用域的标识符在其作用域内,将屏蔽其作用块包含本块的同名标识符,即变量名一样,部分更
10、优先。.void main(void) int a=2, b=3, c=5; coutatbtcendl; int a, b=2; a=b+c; coutatbtcendl; c=a-b; coutatbtcendl; a2b3c5 3 57 2 5ab27-12 3 -1.二、文件作用域 全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的。 其缺省的作用范围是:从定义全局变量的位置开场到该源程序文件终了。当在块作用域内的变量与全局变量同名时,部分变量优先。 .p,q有效int p=1, q=5;float f1( int a) int b,c; .char c1,c2;main(
11、) int m, n; .a,b,c有效m,n有效c1,c2有效全局变量部分变量全局变量添加了函数间数据联络的渠道.4int min;int max (int x, int y) int z; min=(xy)? x : y ; return z; void main (void) int a,b,c; cinab; c=max (a , b) ; cout“The max iscendl; cout“ The min isminendl; 全局变量abc414xy1min0z41函数值为4The max is 4The min is 1 min 在main( )和max( )中均有效,在内存
12、中有独一的存储空间。.在块作用域内可经过作用域运算符“:来援用与部分变量同名的全局变量。 #include int i= 100;void main(void) int i , j=50; i=18; /访问部分变量i :i= :i+4; /访问全部变量i j= :i+i; /访问全部变量i和部分变量j cout:i=:in; couti=in; coutj=jn; :i=104i=18j=122.三、函数原型作用域 在函数原型的参数表中阐明的标识符所具有的作用域称为函数原型作用域,它从其阐明处开场,到函数原型阐明的终了处终了。 float tt(int x , float y); /函数tt
13、的原型阐明 .四、存储类 (存储期)外存内存程序程序区静态存储区动态存储区存放程序代码存放变量需求区分变量的存储类型.作用域全局变量部分变量生存期动态存储变量静态存储变量静态存储:在文件运转期间有固定的存储空间,直到文件运转终了。动态存储:在程序运转期间根据需求分配存储空间,函数终了后立刻释放空间。假设一个函数在程序中被调用两次,那么每次分配的单元有能够不同。程序区静态存储区动态存储区全局变量静态部分变量动态部分变量.int fun(int a) int c; static int b=3; c=a+ b+; return c;void main(void) int x=2, y; y=fun
14、(x); coutyendl; y=fun(x+3); coutyam; c=a*b; couta“*b“=“cendl; d= power(m); couta“*m“=“dendl; 文件file2.c中的内容为:extern int a;int power (int n ) int i, y=1; for (i=1; iy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a+b , a*b) ; cout“The max iscy)? x : y ; return z; 编译时:.内联函数的本质是用存储空间运用更
15、多的存储空间来换取时间减少执行时间。 运用内联函数,可以在编译时直接用代码交换掉函数调用语句,从而使执行时不产生函数调用举例4.7.内联函数的运用场所代码不多,只需几行语句没有复杂构造语句switch和循环,否那么将被当作普通函数没有递归调用阐明代码多时,用普通函数是以时间换取空间代码少时,用内联函数是以空间换回时间,但却保管了函数易读、易改的优点.1、内联函数中,不能包含复杂的控制语句,如循环语句和switch分支语句,以及复杂嵌套的if语句。2、内联函数也要定义在前,调用在后。形参与实参之间的关系与普通的函数一样。3、对于用户指定的内联函数,编译器能否作为内联函数来处置由编译器自行决议。阐
16、明内联函数时,只是恳求而不是命令编译器要这样去做。4、普通是那些规模较小又被频繁调用的简单函数,才适宜声明为inline函数。运用内联函数时应留意:.重载overload:一样名字的函数执行两种以上操作,称为重载如:输出两个数中的大者void max(int,int)/代码一void max(float,float)/代码二void max(double,double)/代码三在C中,不允许函数名一样,而C+中,可以运用一样的函数名,以便于程序员记忆函数名,但执行的操作却不同例4.84.8 函数的重载.所以函数的重载是指完成不同功能的函数可以具有一样的函数名。 C+的编译器是根据函数的实参来确
17、定应该调用哪一个函数的。 int fun(int a, int b) return a+b; int fun (int a) return a*a; void main(void) coutfun(3,5)endl; coutfun(5)endl;825.1、定义的重载函数必需具有不同的参数个数,或不同的参数类型。只需这样编译系统才有能够根据不同的参数去调用不同的重载函数。2、仅前往值不同时,不能定义为重载函数。即仅函数的类型不同,不能定义为重载函数 int fun(int a, int b) return a+b; float fun (int a,int b) return (float)
18、 a*a; void main(void) coutfun(3,5)endl; coutfun(3,5)x;coutsin(x,x)endl;coutsin(x,10)endl;sin(x,x)sin(x,10)不同的参数类型.int add(int a,int b,int c)return a+b+c; int add(int a,int b)return a+b; void main(void)cout3+5=add(3,5)endl;cout3+5+8=add(3,5,8)endl;不同的参数个数.3、在运用重载函数时,同名函数的功能该当一样或相近,不要用同一函数名去实现完全不相关的功能
19、。.所谓函数模板,实践上是建立一个通用函数,其函数类型和形参类型不详细指定,用一个虚拟的类型来代表这个通用函数就称为函数模板凡是函数体一样的函数都可以用这个模板来替代,不用定义多个函数,只需在模板中定义一次即可在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能 例4.104.9 函数模板.定义函数模板的普通方式为template 或template template /模板声明,其中T为类型参数T max(T a,T b,T c) /定义一个通用函数,用T作虚拟的类型名if(ba) a=b;if(ca) a=c;return a;.类型参数可以不只一个,可以根据需
20、求确定个数如template 留意:函数模板只适用于函数的参数个数一样而类型不同,且函数体一样的情况,假设参数的个数不同,那么不能用函数模板.具有缺省参数值和参数个数可变的函数在C+中定义函数时,假设函数反复被调用,而每次调用时某一参数值都固定,那么可以给该参数指定默许值。在调用函数时,假设明确给出了这种实参的值,那么运用相应实参的值;假设没有给出相应的实参,那么运用缺省的值。4.10 有默许参数的函数 .int fac(int n=2) int t=1; for(int i=1;i=n;i+) t=t*i; return t;void main(void) cout fac(6) endl;
21、输出:720fac( )输出:2举例.#include iostreamusing namespace std;int main() void f(int x=100); /声明时指定默许值 f(); f(200); return 0;void f(int x) /此处不能再指定 coutxendl;函数有声明时,默许参数应在声明中指定(在定义中指定非法或不起作用)使器具有缺省参数的函数时,应留意以下几点:.没有声明时,可以在定义时指定默许值#include iostreamusing namespace std;void f(int x=100) coutxendl;int main() f
22、(); f(200); return 0;.函数的参数两个以上时,默许参数值只能从右到左指定调用函数时,指定的实参顺序是自左到右,中间不能有间隔声明:void f(int i,int j=2,int k=3); /正确void f(int i=1,int j,int k=3); /错误!调用时:f(6); /f(6,2,3);f(6,7); /f(6,7,3);f(6,7,8); /f(6,7,8);f(6, ,8); /错误调用!.int area(int long=4 , int width=2) return long* width;void main(void ) int a=8, b
23、=6; cout area(a,b) endl; cout area(a) endl; cout area( ) endl; 48168.默许值可以是全局变量、全局常量,甚至是一个函数。例如:int a=1;int fun(int);int g(int x;fun(a); /OK,允许默许值为函数.默许值不可以是部分变量,由于默许参数的函数调用是在编译时确定的,而部分变量的位置与值在编译时均无法确定。 例如int main()int i;void g(int x=i); / error C2587: “i: 非法将部分变量作为默许参数return 0;.高级言语编译过程源程序文本文件*.CPP
24、目的文件(二进制文件)*.OBJ可执行文件二进制文件*.EXE库文件各种函数编译衔接编译预处置C言语提供的编译预处置的功能有以下三种:宏定义文件包含条件编译4.11 编译预处置 .一、宏定义不带参数的宏定义用一个指定的标识符即名字来代表一个字符串,以后凡在程序中碰到这个标识符的地方都用字符串来替代。这个标识符称为宏名,编译前的替代过程称为“宏展开。# define 标识符 字符串.#define PRICE 30 void main(void) int num, total; /*定义变量*/ num=10; /*变量赋值*/ total=num*PRICE; couttotal=“total
25、endl;编译前用30替代编译程序将宏定义的内容以为是字符串,没有任何实践的物理意义。.1、宏展开只是一个简单的“物理交换,不做语法检查,不是一个语句,其后不加分号“;留意:2、#define命令出如今函数的外面,其有效范围为定义处至根源文件终了。可以用# undef命令终止宏定义的作用域。#define G 9.8void main(void ).# undef Gint max(int a,int b). .3、对程序中用双引号括起来的字符串内容,即使与宏名一样,也不进展置换。4、在进展宏定义中,可以用已定义的宏名,进展层层置换。.# define R 3.0# define PI 3.1
26、415926# define L 2*PI*R# define S PI*R*Rvoid main(void) cout“L=“L“ S=Sxy; area=S(x, y); /* area=x*y; */方式参数实践参数宏定义宏调用定义的宏实参代入后复原.#define PI 3.1415926#define S(r) PI*r*rvoid main(void) float a, area, b; a=3.6; b=4.0; area=S(a); cout“r=“a“narea=areaendl;S(r)PI*r*rS(a)PI*a*aPI*a*a编译前机械交换,实参形参一一对应.#defi
27、ne PI 3.1415926#define S(r) PI*r*rvoid main(void) float a, area, b; a=1; b=2; area=S(a+b); cout“r=“a“narea=areaendl;S(r)PI*r*rS(a+b)PI*a+b*a+b编译前机械交换,实参形参一一对应宏展开时实参不运算,不作语法检查#define S(r) PI*(r)*(r)S(a+b)PI*(a+b)*(a+b)错误.定义宏时在宏名与带参数的括弧间不能有空格。#define S_ (r) P*r*r .二、文件包含一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。# include “文件名file1.cppBA#include “file2.cppABfile1.cppfile2.cpp.留意:1、文件名是C的源文件名,是文本文件,后缀名可以任选。*.cpp *.h2、一个#include语句只能指定一个被包含文件。3、文件名用双引号或尖括号括起来。4、包含后一切源文件编译
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度建筑施工合同变更合同
- 2024年度工业废弃物回收服务合同
- 2024年度电子政务系统设计与实施合同
- 2024年度人力资源服务合同:人力资源公司为某企业提供人才招聘和培训服务
- 2024年度技术转让合同:某高科技公司技术成果转让合同
- 2024年度物流仓储服务合同(服务内容和仓储地点)
- 2024年度工程采购合同的复杂条款解析
- 2024年度服装定制与销售合同
- 2024年度医疗设备研发与购买合同
- 04版影视制作合同(含剧本创作)
- 2023年天津公务员已出天津公务员考试真题
- 施工现场临水施工方案
- 2022年公务员多省联考《申论》真题(四川县乡卷)及答案解析
- 艾滋病职业防护培训
- 全科医生转岗培训结业考核模拟考试试题
- 2025年高考数学专项题型点拨训练之初等数论
- 上海市浦东新区2024-2025学年六年级上学期11月期中数学试题(无答案)
- 吃动平衡健康体重 课件 2024-2025学年人教版(2024)初中体育与健康七年级全一册
- 通信技术工程师招聘笔试题与参考答案(某世界500强集团)2024年
- 2024至2030年中国节流孔板组数据监测研究报告
- 2024年第九届“学宪法、讲宪法”活动知识竞赛测试题库及答案
评论
0/150
提交评论