要点掌握函数的定义_第1页
要点掌握函数的定义_第2页
要点掌握函数的定义_第3页
要点掌握函数的定义_第4页
要点掌握函数的定义_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章第五章 函函 数数要点:掌握函数的定义,函数的原形,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握函数重载的使用方法,关键字inline的含义与使用,掌握变量的作用域与生存期,了解函数的作用域。第五章第五章 函函 数数第五章第五章 C+函数函数 重点考核的内容(知识点):重点考核的内容(知识点): 1函数的声明格式与定义格式。 2函数调用表达式的语法格式及执行过程。 3函数定义中形参变量的作用及实虚参数结合的过程。 5函数声明(原型)语句的定义格式及作用。 6形参为一维数组或二维数组时的说明格式、对应实参的语法规则、调用时数组参数传递的过程。 7变量的作用域的概念和含

2、义;系统对全局变量、static变量、局部变量的建立和初始化过程。 第五章第五章 函函 数数一般考核的内容(知识点):一般考核的内容(知识点): 1函数模板(又称模板函数)的定义格式及其作用。函数模板的实例化,函数模板与一般函数定义之间的优先关系。 2函数的递归调用的概念和递归函数的具体执行过程 3头文件在程序文件中的位置和作用。 4函数声明或定义中可选参数的使用,对应的函数调用的格式及执行过程。 5内联函数的定义与作用。 6函数重载的概念。 l考核要求:考核要求:l 掌握以上重点考核的内容,了解其一般考核的内容。l 第五章第五章 函函 数数 5.1 函数概述函数概述1函数:将大的程序分成功能

3、相对独立的小函数:将大的程序分成功能相对独立的小模块,每一个模块称之为函数。模块,每一个模块称之为函数。 函数分为用户定义的函数和标准库函数两种。函数分为用户定义的函数和标准库函数两种。 一个一个c+程序由一个程序由一个main()函数和若干用户定函数和若干用户定义的函数组成。义的函数组成。第五章第五章 函函 数数2. 函数定义函数定义 格式:类型格式:类型 函数名函数名(参数表参数表) 函数体函数体 例如:例如:double sqare(double n) return n*n); 第五章第五章 函函 数数3函数类型函数类型 (1)有参数、有返回值有参数、有返回值 例例 int bigger

4、(int a,int b) return (ab)?a:b; 第五章第五章 函函 数数(2)有参数、无返回值有参数、无返回值例例 void delay(long a) for(int i=1;i=a;i+) 第五章第五章 函函 数数(3)无参数、有返回值无参数、有返回值例例 int getx() int x; coutx; return x; 第五章第五章 函函 数数(4)无参数、无返回值无参数、无返回值例例 void message() coutthis is a message.n; 第五章第五章 函函 数数3. 函数定义中,若类型省略,默认函数定义中,若类型省略,默认为为int,但一般不

5、要省略。但一般不要省略。例例 f(int s) return s+1; 例例 int f(int s) return s+1; 第五章第五章 函函 数数5.3 函数调用函数调用1. 函数调用格式与方式。函数调用格式与方式。(1)函数调用格式:函数名函数调用格式:函数名(实参表实参表)(2)函数调用方式函数调用方式l作为表达式的函数调用作为表达式的函数调用l作为语句的函数调用作为语句的函数调用 第五章第五章 函函 数数例:例:#include void hi() cout“hi!”endl; double square(double n) return n*n; void main() doub

6、le s=0,i; for(i=1;i=100;i+) s=s+square(i);/作为表达式的函数调用作为表达式的函数调用 hi();/作为语句的函数调用作为语句的函数调用 cout“1至至100的平方和:的平方和:”s2) return (fib(x-1)+fib(x-2); else return 1; 第五章第五章 函函 数数l间接递归调用:函数间接递归调用:函数A调用函数调用函数B,而函数,而函数B又调用了又调用了函数函数A。 例例5.2 见书。见书。 第五章第五章 函函 数数(4)递归的条件递归的条件 l须有完成函数任务的语句。须有完成函数任务的语句。例:例:#include v

7、oid main() if(val1) count(val-1); cout”ok:”val1)。 l 一个递归调用语句:如上一个递归调用语句:如上例例count(val-1)。 l先测试,后递归调用。先测试,后递归调用。第五章第五章 函函 数数例:例:#include void main() count(val-1);/无穷递归,最终栈空间枯竭而出错无穷递归,最终栈空间枯竭而出错if(val1) cout”ok:”valendl; 第五章第五章 函函 数数(5)消除递归:用非递归函数代替递归函数。消除递归:用非递归函数代替递归函数。例:例:long fact(int n) if(n=1) r

8、eturn 1; return fact(n-1)*n; 第五章第五章 函函 数数例:例:long fact(int n) long temp=1; for(int i=1; ib) return a; else return b; 第五章第五章 函函 数数4. return语句语句 功能:将程序的执行返回到函数调用处,并将其后表达式功能:将程序的执行返回到函数调用处,并将其后表达式的值作为函数值返回。的值作为函数值返回。 (1)return语句后面的括号是可选的。语句后面的括号是可选的。例:例:return (3); 等价等价与与 return 3; 第五章第五章 函函 数数(2)若函数的返

9、回类型是若函数的返回类型是void,在函数体中也可使用,在函数体中也可使用return语句,但不能有返回值。语句,但不能有返回值。 例:例:void message(int a) if(a10) return; 第五章第五章 函函 数数 5. 函数原型、函数定义和函数调用的关系函数原型、函数定义和函数调用的关系 (1)函数必须先有原型函数必须先有原型(或定义或定义)后调用。后调用。 (2)函数定义包含函数原型。函数定义包含函数原型。 (3)若函数定义于函数原型之前,则不必给出函数原型。若函数定义于函数原型之前,则不必给出函数原型。 (4)若函数定义于函数原型之后,则必须给出函数原型。若函数定义

10、于函数原型之后,则必须给出函数原型。第五章第五章 函函 数数 例:例:#includedouble max(double,double);/函数原型函数原型void main() c=max(a,b);/函数调用函数调用double max(double x,double y)/函数定义函数定义 if(xy) return x; else return y; 例:例:#includedouble max(double x,double y)/函数定义函数定义 if(xy) return x; else return y;void main() c=max(a,b);/函数调用函数调用第五章第五

11、章 函函 数数6. 一般,我们不将函数原型、函数调用和函数定义放在同一一般,我们不将函数原型、函数调用和函数定义放在同一程序文件,而是分别保存。函数原型归入头文件,函数定程序文件,而是分别保存。函数原型归入头文件,函数定义归入程序文件,函数调用归入主程序文件。从而形成项义归入程序文件,函数调用归入主程序文件。从而形成项目的多文件结构。目的多文件结构。例:例:/头文件头文件area.h double area(double); /程序文件程序文件area.cpp #include”area.h” #define PI 3.14159 double area(double r) return r*

12、r*PI; /主程序文件主程序文件areat.cpp #include”area.h” #include void main() area=area(radius); 第五章第五章 函函 数数 7. 一个一个c+项目项目(控制台应用程序控制台应用程序)的结构。的结构。 主程序文件主程序文件(.cpp)+头文件头文件(.h) 程序文件程序文件1(.cpp)+头文件头文件(.h) 程序文件程序文件2(.cpp)+头文件头文件(.h)项目项目(.prj) 程序文件程序文件n(.cpp)+头文件头文件(.h) 第五章第五章 函函 数数5.4 函数调用中的参数传递。函数调用中的参数传递。 5.4.1 传

13、值方式:形参传值方式:形参=实参的值实参的值例:例:(形参为简单变量形参为简单变量)#includedouble time2(double n) n=n*2; return n;第五章第五章 函函 数数void main() double m=7.0; coutendlm; coutendltime2(m); coutendlm;结论:当形参为普通变量时,结论:当形参为普通变量时,形参和实参按传值方式结合。形参和实参按传值方式结合。n=m的值的值 n*=2;return n;#includedouble time2(double n) n=n*2; return n;第五章第五章 函函 数数

14、5.4.2 传地址方式:形参传地址方式:形参=实参的值实参的值(地址值地址值)例:例:(形参为数组变量形参为数组变量)设计函数设计函数sum,它计算并返回参数数组中所有它计算并返回参数数组中所有元素的合计值。元素的合计值。 /头文件头文件 int sum(int array,int size);第五章第五章 函函 数数/程序文件程序文件sum.cpp#include”sum.h”int sum(int array,int size) int s=0; for(int i=0;isize;i+) s+=arrayi; return s;第五章第五章 函函 数数/主程序文件主程序文件sumt.cp

15、p#include#include”sum.h”void main() int v1=1,2,3,4,5; coutsum(v1,5)endl; int v2=1,2,3,4,5,6,7,8; coutsum(v2,8)endl;第五章第五章 函函 数数sum(v1,5)=结论:当参数为数组时,形参和实参按传地址方式结合。结论:当参数为数组时,形参和实参按传地址方式结合。例:见书。例:见书。size=5的值的值 /传值方式传值方式int s=0;for(int i=0;isize;i+) s+=v1i;/传地址方式传地址方式return s;第五章第五章 函函 数数5.4.3 默认参数的函数默

16、认参数的函数1默认参数:函数的形参表中,若给形参定义了默认默认参数:函数的形参表中,若给形参定义了默认值,称此参数为默认参数。又称可选参数。值,称此参数为默认参数。又称可选参数。 2函数调用时,若不给出可选参数所对应的实参,则函数调用时,若不给出可选参数所对应的实参,则实参取默认值。实参取默认值。 第五章第五章 函函 数数例:例:int f(int a,char b,char c=z,int d=100);/c、d为默认参数为默认参数 f(3,a,b)等价等价于于f(3,a,b,100)f(3,a)等价等价于于f(3,a,z,100) 第五章第五章 函函 数数3可选参数的声明可选参数的声明 (

17、1)既有函数原型又有函数定义时,只能在函数原型中声明既有函数原型又有函数定义时,只能在函数原型中声明可选参数。函数定义中不允许声明可选参数。可选参数。函数定义中不允许声明可选参数。(2)只有函数定义时,可选参数方可出现在函数定义中。只有函数定义时,可选参数方可出现在函数定义中。 第五章第五章 函函 数数4可选参数的顺序规定可选参数的顺序规定 (1)可选参数必须为形参表中最后且连续的若干个参数。可选参数必须为形参表中最后且连续的若干个参数。 例:例:void func(int a=1,int b, int c=3,int d=4);/错误错误void func(int a,int b=2, in

18、t c=3,int d=4);/正确正确第五章第五章 函函 数数(2)调用具有可选参数的函数时,被省略的实参只能是最后调用具有可选参数的函数时,被省略的实参只能是最后且连续的若干个可选参数。且连续的若干个可选参数。 例:例:void func(int a,int b=2,int c=3,int d=4); func(10,15,20,30);/正确正确 func();/错误错误 func(12,12);/正确正确 func(2,15, ,20);/错误错误例:见书。例:见书。 第五章第五章 函函 数数5.5 内联函数内联函数(inline function) 1为提高程序的执行效率和可读性,一

19、般将只有为提高程序的执行效率和可读性,一般将只有1至至5行代码的简单函数声明为内联函数。内联函数必须在被行代码的简单函数声明为内联函数。内联函数必须在被调用之前声明或调用。调用之前声明或调用。例:例:inline int add2(int n) return n+2; 第五章第五章 函函 数数2内联函数的函数体限制。内联函数的函数体限制。(1)内联函数只适合于只有内联函数只适合于只有1至至5行的小函数。行的小函数。 (2)递归函数不能用作为内联函数。递归函数不能用作为内联函数。 (3)内联函数体中,不能含有复杂的结构控制语句。如:内联函数体中,不能含有复杂的结构控制语句。如:switch和和w

20、hile语句等。语句等。 第五章第五章 函函 数数5.6 重载函数重载函数(function overloading)1函数重载:即允许定义同名的函数,但重载的函数函数重载:即允许定义同名的函数,但重载的函数必须在形参的数量或类型上或顺序上与其他同名函数有必须在形参的数量或类型上或顺序上与其他同名函数有所不同。所不同。 例:例:long add(long a,long b)return a+b; long add(double a,double b)return a+b; 第五章第五章 函函 数数 2形式参数:函数原型或函数定义中的参数。简称形参。形式参数:函数原型或函数定义中的参数。简称形参

21、。 实在参数:函数调用中的参数。简称实参。实在参数:函数调用中的参数。简称实参。 3函数重载的内部实现方法函数重载的内部实现方法-名字粉碎名字粉碎(name mangling)名字粉碎:名字粉碎:c+根据函数名和参数信息来生成内部函数根据函数名和参数信息来生成内部函数名的方法。名的方法。 第五章第五章 函函 数数 例:例: 重载函数重载函数 内部函数名内部函数名 int f(char a); f_c int f(char a,int b,double c); f_cid int f_cid(); f_cidv 第五章第五章 函函 数数5可选参数与函数重载可选参数与函数重载例:例:int f(i

22、nt k,int m=0,double d=0.0); 则函数调用则函数调用f(3,5,6.7);/正确正确f(3,5);/正确正确f(3);/正确正确 第五章第五章 函函 数数但以下函数均不能重载:但以下函数均不能重载: int f(int k,int m=0,double d=0.0); int f(int);/f(2)调用谁调用谁?int f(int,int);/f(2,3)调用谁调用谁?int f(int,int,double);/f(2,3,5.0)调用谁调用谁?int f(int,double=0.0);/f(2)调用谁调用谁?结论:对有可选参数的函数,在逐个去掉可选参数后形结论:

23、对有可选参数的函数,在逐个去掉可选参数后形成的函数不能重载。成的函数不能重载。第五章第五章 函函 数数 例:例:若有若有int fp(char c,int k=0,double d=100.0);则下列函数中可以重载的是则下列函数中可以重载的是( A, D )A. int fp(); B.void fp(char c);C. int fp(char,int); D.void fp(char,int,int); 第五章第五章 函函 数数5.7 函数和变量的作用域函数和变量的作用域1. 一个一个c+项目项目(控制台应用程序控制台应用程序)的结构。的结构。 主程序文件主程序文件(.cpp)+头文件头

24、文件(.h) 程序文件程序文件1(.cpp)+头文件头文件(.h) 程序文件程序文件2(.cpp)+头文件头文件(.h)项目项目(.prj) 程序文件程序文件n(.cpp)+头文件头文件(.h) 第五章第五章 函函 数数 2. 几个概念几个概念 l 跨文件作用域:不仅在定义它的程序文件中有作用,跨文件作用域:不仅在定义它的程序文件中有作用,在同一项目的其它程序文件中也有作用。又称全局作用在同一项目的其它程序文件中也有作用。又称全局作用域。域。l 文件作用域:仅在定义它的程序文件中有作用。文件作用域:仅在定义它的程序文件中有作用。l 局部作用域:仅在定义它的函数或块中有作用。局部作用域:仅在定义

25、它的函数或块中有作用。 第五章第五章 函函 数数l 静态生命期:整个应用程序运行期间不会静态生命期:整个应用程序运行期间不会消失消失(死亡死亡)。l 局部生命期:在定义它的函数或块运行结局部生命期:在定义它的函数或块运行结束立即消失束立即消失(死亡死亡)。又称自动生命期。又称自动生命期。 第五章第五章 函函 数数 3. 结论结论第五章第五章 函函 数数 5.7.2 变量的作用域和生存期变量的作用域和生存期 1 全局变量全局变量 例例1(无修饰的全局变量无修饰的全局变量)/ch61.prjch61.cppch611.cpp /ch61.cpp#includevoid fn1();void fn2

26、();int n; /全局变量全局变量void main() n=3; fn1(); coutnendl;void fn1()fn2();/ch611.cppextern int n; /n是另一程序文件中定是另一程序文件中定义的全局变量义的全局变量void fn2() n=8;结果:结果:8第五章第五章 函函 数数例例2(static修饰的全局变量修饰的全局变量)/ch62.prjch62.cppch621.cpp /ch62.cpp#includevoid fn();int n; /全局变量全局变量void main() n=20; coutnendl; fn();/ch621.cppst

27、atic int n; /默认初始化为默认初始化为0void fn() n+; coutnendl;结果:结果:201若将若将static改成改成extern,则,则结果:结果:2021第五章第五章 函函 数数6局部变量局部变量例例1(无修饰的局部变量无修饰的局部变量) #include void main() int x=5,y=1; /局部变量局部变量coutx1=x,y=yendl; int x=3; /局部变量局部变量 coutx2=x,y=yendl; coutx3=x,y=yendl; 结果结果:x1=5,y=1 x2=3,y=1 x3=5,y=1 第五章第五章 函函 数数例例2(

28、无修饰的局部变量无修饰的局部变量) #include void main() void increament(); increament(); increament(); increament(); void increament() int i=0; /局部变量局部变量 i+; couti,; 结果:结果:1,1,1 第五章第五章 函函 数数例例3(static修饰的局部变量修饰的局部变量) #include void main() void increment(); increament(); increament(); increament(); void increment() sta

29、tic int i; /static修饰的局部变量修饰的局部变量 i+; coutix,; 结果:结果:1,2,3 第五章第五章 函函 数数例例4(综合举例综合举例) #include void func(); int n=1;/全局变量全局变量 void main() static int a;/静态局部变量静态局部变量 int b=-10; func();couta:ab:bn:nendl; b+=4; couta:ab:bn:nendl; n+=10; func(); void func() static int a=2; /静态局部变量静态局部变量 int b=5;/局部变量局部变量

30、a+=2; n+=12; b+=5; couta:ab:bn:nendl; 结果:结果:a:0 b:-10 n:1a:4 b:10 n:13a:0 b:-6 n:13a:6 b:10 n:35第五章第五章 函函 数数5.7.1 函数的作用域函数的作用域 1函数原型或函数定义时,若加上函数原型或函数定义时,若加上extern修饰或无任修饰或无任何修饰时,具有跨文件作用域。何修饰时,具有跨文件作用域。 2函数原型或函数定义时,若用函数原型或函数定义时,若用static修饰,称为静态修饰,称为静态函数,具有文件作用域。函数,具有文件作用域。 3函数均具有静态生存期。函数均具有静态生存期。 第五章第五

31、章 函函 数数例:例:/file1.cpp void fn(); void fn1(); void main() fn(); fn1(); /file2.cpp #include void fn(); static void fn1();/文件作用域文件作用域 void fn() void fn1() 说明:说明:fn1()具有文件作用域,即只在具有文件作用域,即只在file2.cpp中有作用,中有作用,file1.cpp中调中调用用fn1(),会产生错误。会产生错误。 第五章第五章 函函 数数5.8 函数模板函数模板(function template)1.函数模板:一系列相关函数定义的模型

32、或样板。函数模板:一系列相关函数定义的模型或样板。这些函数的代码除了因数据类型不同而有所差这些函数的代码除了因数据类型不同而有所差异外,其结构基本相同。函数模板可归入头文异外,其结构基本相同。函数模板可归入头文件。件。第五章第五章 函函 数数例:对函数例:对函数max(x,y) int max(int a,int b)return (ab)?a:b; long max(long a,long b)return (ab)?a:b; float max(float a,float b)return (ab)?a:b; double max(double a,double b)return (ab)?a:b; 可定义一个样板。可定义一个样板。第五章第五章 函函 数数2. 格式:格式:template函数定义函数定义例例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论