收藏 分享(赏)

第06章 函数.ppt

上传人:hwpkd79526 文档编号:7414359 上传时间:2019-05-16 格式:PPT 页数:67 大小:279.50KB
下载 相关 举报
第06章 函数.ppt_第1页
第1页 / 共67页
第06章 函数.ppt_第2页
第2页 / 共67页
第06章 函数.ppt_第3页
第3页 / 共67页
第06章 函数.ppt_第4页
第4页 / 共67页
第06章 函数.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、第6章 函数,6.1 函数的定义 6.2 函数的参数 6.3 函数的返回值 6.4 函数的原型说明 6.5 函数的调用 6.6 作用域和存储类型 6.7 C+增加的函数特性,6.1 函数的定义,函数:功能独立的语句块。需先定义后使用。 函数的优势:易于实现 便于调用 简化程序支持复杂问题的功能分解和模块化程序设计。 函数分为:库函数和自定义函数。 main函数:系统约定,用户定义,有且仅有一个,程序执行的唯一入口,由操作系统调用。main函数通过调用库函数或自定义函数实现程序的功能。 库函数(预定义函数):C+编译系统、操作系统或其它系统为方便用户程序设计而预定义的函数。使用库函数可简化程序,

2、提高编程效率。 用户自定义函数:用户编写、完成特定功能的函数。,函数定义格式,()/函数头 /函数体 ,有参且有返回值。如:int max(int a,int b) return (ab)?a:b; 有参但无返回值。如:void swap(int x,int y) int t=x;x=y;y=t; 无参但有返回值。如:char getc( ) char x;cinx;return x; 无参也无返回值。如:void mess( ) cout”你好,欢迎学习C+!”; ,函数定义举例,6.2 函数的参数,函数的形式参数简称形参。 当被调函数有参时,主调函数和被调函数之间通过形参实现数据传递。 函

3、数的形参仅在函数被调用时,才由系统分配内存,用于接收主调函数传递来的实际参数。 函数的实际参数简称实参。 函数调用时实参的类型应与形参的类型一一对应。 实参应有确定值,可为常量、变量或表达式。 函数调用时系统才为形参分配内存,与实参占用不同的内存,即使形参和实参同名也不会混淆。函数调用结束时,形参所占内存即被释放。,6.3 函数的返回值,函数的返回值:由被调函数计算处理后向主调函数返回的计算结果,最多只能一个,用return实现。 无返回值的函数其返回值类型应说明为void类型,否则将返回一个不确定的值。 在执行被调函数时,遇到return语句就结束函数的执行,返回到主调函数。若函数中无ret

4、urn语句,会执行到函数体最后的”为止,返回到主调函数。,return语句的格式:return ;/用于带有返回值的函数作用:先计算的值。若的值的类型与该函数的类型不同,则将的类型强制转换为该函数的类型。再将的值返回给调用函数并将程序的流程由被调用函数转给调用函数。return; /用于无返回值的函数作用:将程序的流程由被调用函数转给调用函数。对于无返回值的函数,若函数没有return语句,则执行完最后一条语句后将返回到调用函数。,若函数有多个返回分支,则应保证每个分支均有确定的返回值,否则可能出现逻辑错误。例如:char toLower(char c)if(c=A现象:编译该函数时将出现一个

5、警告,指出未使每个执行分支均有确定的返回值。,原因:若c是小写字母,则该函数无确定的返回值。 改正: char toLower(char c) if(c=A ,6.4 函数原型,函数后定义先使用是常见现象,如: 自顶向下、逐步求精的程序设计方法,使程序员习惯将main函数作为程序的第一个函数。这样在main函数中可能调用其后定义的许多函数。 程序由多个文件组成时,若一个文件中的函数要调用另一个文件中的函数时,也会出现类似问题。 使用库函数。 函数原型的作用:使函数能后定义先使用。 函数原型的含义:对定义在后或库中的函数,在使用前做声明,包括函数名、返回类型及参数类型。,函数原型的格式:();

6、函数原型与函数定义在返回类型、函数名和参数类型方面必须一致。 函数原型是语句,必须以分号“;”结束,而函数定义时的头部之后不能有分号。 库函数的原型通常在头文件中声明,在编程时,若要使用某个头文件中的库函数,则必须先将这个头文件包含到程序中。例如:#includedouble x=sqrt(2.0);,函数原型举例:#includeint dec(int a,int b); /函数调用前做原型说明/或:int dec(int,int);void main(void)cout“两数之差=“dec(20,3);/函数先调用int dec(int a,int b) /函数后定义return a-b;

7、,6.5 函数的调用,函数调用的格式:()当调用一个函数时,其实参的个数、类型及排列次序必须与函数定义时的形参一致。对于无形参的函数,调用时实参表为空。 函数调用的方式: 语句调用 表达式调用,函数调用举例:语句调用。#includevoid mess(char *msg)coutmsgendl;void main(void)mess(“同学们,你们好!”); /语句调用,程序运行结果: 同学们,你们好!,无返回值的函数只能用函数调用语句来调用。 在不需要利用返回值时,有返回值的函数也可用函数调用语句来调用。,函数调用举例:表达式调用。#includeint max(int m,int n)r

8、eturn mn?m:n;void main(void) int a, b;coutab;cout“两数之大数:“max(a,b)n;,程序运行结果:输入两个整数:156 201 两个数中的大数为:201,若函数有返回值,则函数调用可出现在表达式中,使函数的返回值参与表达式的运算。,函数是独立完成某个功能的模块,函数与函数之间主要通过参数和返回值来联系。 函数的参数和返回值是该函数对内、对外联系的窗口,称为接口。 从函数调用角度看,可将函数看作是一个“黑盒”,除了接口外,其他不必关心。 “黑盒”函数的接口用函数原型描述。例如,大量的库函数都是“黑盒”函数。 函数调用时,系统为形参分配相应的存储

9、单元,用于接收实参传递的数据。注意:函数调用期间,形参和实参各自拥有独立的存储单元。 函数调用结束,系统回收分配给形参的存储单元。,函数调用时,实参向形参传递参数的方式有三种: 值传递,也称传值。形式:形参为普通变量,实参为表达式,实参向形参赋值。特点:参数传递后,实参和形参不再有任何联系。注意:实参是表达式,故形参不可能给实参赋值。 引用传递,也称传引用。形式:形参为引用型变量,实参为变量,实参为引用型形参初始化。特点:参数传递后,形参是实参的别名,彼此关联。 指针传递,也称传指针。形式:形参为指针变量,实参为指针表达式。特点:参数传递后,形参可读写实参所指的存储空间。,6.5.1函数的传值

10、调用,函数的传值调用分析:#includevoid swap(float x,float y)/仅交换形参x和y float t=x;x=y;y=t;cout“x=“x“ty=“yn;void main(void) float a=40,b=70;swap(a,b); /未交换实参a和bcout“a=“a“tb=“bn;,输出结果: x=70 y=40 a=40 b=70,传值调用的优点:函数调用对其外界的变量无影响,最多只能用return返回一个值,函数独立性强。举例:输入一个正整数,判断该数是否为素数。#include#includeint prime(int m) for(int i=2

11、;i=sqrt(m);i+) if(m%i=0) return 0; return 1;,void main(void) int m;coutm;if(prime(m) coutm“是素数n“;else coutm“不是素数n“;,运行结果:请输入一个数:2323是素数.,6.5.2函数的引用调用,引用:变量的别名。对别名的访问就是对别名所关联变量的访问,反之亦然。例如:int i;int /此时i的值也为15 使用引用应注意: 定义引用时,应同时对它初始化,使它与一个类型相同的已有变量关联; 一个引用与某变量关联,就不能再与其它变量关联。 引用主要用作函数的形参和返回值。,若引用做函数的形参

12、,则函数调用时,实参用变量名。实参为形参初始化,即声明形参是实参的别名。这样,在被调函数中,对形参的操作就是对实参的操作。 用引用调用,使两实参做互换。#includevoid swap(float ,此时swap函数中的形参x和y分别是main函数中的实参x和y的别名。,程序输出结果: x=70 y=40,6.5.3 函数调用过程分析,执行程序时,若遇到调用函数f(),则暂停当前函数的执行,保存断点(即返回地址和现场),然后转去执行f()函数。当遇到return语句或者函数结束时,则恢复先前保存的现场,并从先前保存的返回地址开始继续执行。,6.5.4函数的嵌套调用,C+语言不允许在一个函数的

13、定义中再定义另一个函数,即不允许函数的嵌套定义。但允许在一个函数的定义中调用另一个函数,即允许函数的嵌套调用。 例6.7 计算1k+2k+3k+nk。#includeint sump(int,int); /函数原型声明int powers(int,int);void main(void) int k=4,n=6;cout“从1到“n“的“k“次幂=“sump(k,n)endl;,int powers(int n,int k)/计算nkfor(int i=1,product=1;i=k;i+)product*=n;return product;int sump(int k,int n) /计算1

14、k+2k+3k+nkfor(int i=1,sum=0;i=n;i+)sum+=powers(i,k);return sum;,程序运行结果: 从1到6的4次幂之和=2275,6.5.5函数的递归调用,函数的递归调用:一个函数直接或间接调用本身。 递归举例:求4!。分析:通常有两种求法。 递推法:由已知开始,逐步递推求解,最终求得未知。由1!=1,求得2!=1!*2=1*2=2;再由2!=2,求得3!=2!*3=2*3=6;最后,由3!=6,求得4!=3!*4=6*4=24。,递归法:将n!转换为:直接求4!:由于无法一下子求得结果,把它转换成4*3!,只要能求得3!,4!就能求得。接着求3!

15、:转换成3*2!。再求2!:转换成2*1!。直到变成求1!的问题为止(因1!为1),递推过程结束。然后,再逐级回归,依次得到2!=2*1=2,3!=3*2=6和4!=4*6=24。这种方法包括递推和回归两个阶段,递归结束条件是结束递推、开始回归的转折点。,求4!的递归程序:#includeint f(int n) if(n=1) return 1; /Aelse return n*f(n-1);/Bint main(void) cout“4!=“f(4)n;return 0;,递归调用本质上是嵌套调用,只不过是嵌套调用自身。 f(4)函数调用时,系统自动为它的形参n分配内存,用于接收实参,递推

16、时向嵌套调用的函数传递参数,回归时要向主调函数返回值。嵌套调用f(3)、f(2)、f(1)函数时,系统也分别自动为它们的形参n分配独立内存。,递归函数的执行包括递推和回归两个过程。一旦调用递归函数,这两个过程由系统自动执行。 以f(4)函数调用为例说明递归函数的执行。因f(4)中实参不为1,故执行B行语句,即成为4*f(3)。,f(3)成为3*f(2),直到出现f(1)函数调用时,才执行A行语句,将值1返回。如图左边所示。当出现函数调用f(1)时,递归结束,转入回归过程。将返回值1与2相乘后的结果作为f(2)的返回值,与3相乘后,结果值6作为f(3)的返回值,依次回归。如图右边所示。,从递归函

17、数f的代码和其执行过程看,尽管函数体只使用if分支结构,代码非常简单,但通过递归调用隐式实现了循环。正是通过递归调用将循环隐藏起来,大大简化了算法的表达。 递归法解决问题的关键: 善于归纳问题的递归特征:将原问题转化为一个新问题,而这个新问题与原问题有相同的解决方法。继续这种转化,直到转化出来的问题是一个有已知解的问题为止。例如,n!可转化为n*(n-1)!,最终1!=1。 善于分析和总结问题的递归求解结束条件:只有有限次递归才有实际意义。例如,求n!时,n为1是递归结束条件。,例6.10 输入一个整数,逐位正序和反序输出。如输入3456,则输出3456和6543。分别设计两个函数,一个实现正

18、序输出,另一个实现反序输出。 分析:求各位数可转换成将给定的整数重复除以10求余,求出的余数就是对应位上的数值,直到商为0为止。如3456%10的余数为6,即先得到最低位上的数值为6,商为345;345%10的余数为5,商为34;34%10的余数为4,商为3;3%10的余数为3,商为0,至此结束。 将问题转换为求余问题,可用递归方法解决:,#includevoid fzx(int n)/先递归,后输出余数,则为正序 if(n/10!=0) fzx(n/10);coutn%10t; void ffx(int n)/先输出余数,后递归,则为反序 coutn%10t;if(n/10!=0) ffx(

19、n/10); ,void main(void) int m; coutm;cout“正序输出:“;fzx(m);cout“n反序输出:“;ffx(m); ,程序运行结果:请输入一个整数:3456正序输出:3 4 5 6反序输出:6 5 4 3,因递归调用大大简化了算法的表达,故递归成为设计和描述算法的有力工具,常用于描述复杂算法。 例6.11 汉诺塔问题。有三根柱子A、B、C。设A柱上有n个盘子,盘子的大小不等,大的盘子在下,小的盘子在上,如下图所示。要求将A柱上的n个盘子移到C上,每一次只能移一个盘子。在移动过程中,可以借助于任一根柱子,但必须保证三根柱子上的盘子都是大的盘子在下,小的盘子在

20、上。要求编一个程序打印出移动盘子的步骤。,分析:若用常规方法解决这个问题,很快发现这个问题太复杂。但用递归方法,就可将移动n个盘子的问题简化为移动n-1个盘子的问题,即将n个盘子从A柱移到C柱可分解为下面三个步骤: 将A柱上的n-1个盘子借助于C柱移到B柱上; 将A柱上的最后一个盘子移到C柱上; 再将B柱上的n-1盘子借助于A柱移到C柱上。这种分解可一直递推下去,直到变成移动一个盘子,递推结束。其实以上三个步骤只包含两种操作: 将多个盘子从一根柱子移到另一根柱子上,是一个递归函数。 用hanoi(int n,char A,char B,char C)函数把A柱上的n个盘子借助于B柱移到C柱上。

21、 将一个盘子从一根柱子移到另一根柱子。用函数move(char x,char y)将1个盘子从x柱移到y柱,并输出移动盘子的提示信息。,#includevoid move(char,char); void hanoi(int,char,char,char);void main(void) int n;coutn;hanoi(n,A,B,C); void move(char x,char y)/将1个盘子从x柱移到y柱 coutx“yendl; ,/把A柱上的n个盘子借助于B柱移到C柱上 void hanoi(int n,char A,char B,char C) if(n=1) move(A,

22、C);else/将A柱上的n-1个盘子借助于C柱移到B柱上hanoi(n-1,A,C,B);/将A柱上的最后一个盘子移到C柱上move(A,C);/再将B柱上的n-1盘子借助于A柱移到C柱上hanoi(n-1,B,A,C); ,6.6 作用域和存储类型,作用域:程序中说明的标识符的有效区域。分为:块作用域(局部作用域)文件作用域(全局作用域)函数原型作用域函数作用域类作用域:后续章节介绍。命名空间作用域:后续章节介绍。 变量的存储类型:在变量说明时指定,决定何时为变量分配存储空间及该存储空间所具有的特征。,6.6.1作用域 1块作用域,块:用一对花括号“ ”括起来的部分程序。 块作用域:在块内

23、说明的标识符,其作用域始于标识符的说明处,止于块的结尾处。只能在该块内引用。,局部变量,局部变量:在函数内或在块内定义的变量。 局部变量的内存:程序执行到该块时,系统自动在栈内为局部变量分配内存,在退出该块时,系统自动回收该块的局部变量占用的内存。 局部变量仅在其作用域范围内有效。 举例如图6-7所示: j、k、a、b均为局部变量。 作用域可以覆盖。如j、k变量的作用域覆盖了a、b变量的作用域。,不同作用域的局部变量同名问题,标识符同名:同一作用域不允许,不同作用域允许。 不同作用域的局部变量的同名问题。#includevoid main(void) int i=10,j=20,k=i+j;

24、couti,j,kn; int i=50,j=60;k=i+j;couti,jn;couti,j,kn;,规则:内层标识符在其作用域内,将屏蔽其外层作用块的同名标识符。,程序运行结果:10,20,3050,6010,20,110,for语句中说明的变量具有块作用域,在for语句中说明的变量具有块作用域。在标准C+中,其作用域仅作用于for语句;但VC+中,其作用域为包含for语句的那个内层块,并非仅作用于for语句。 例如: for(int i=0;i10;i+) couti*it;couti; /VC+允许,标准C+不允许在VC中,这段程序等同于: int i;for(i=0;i10;i+)

25、 couti*it;couti;,2文件作用域,全局变量(标识符):在函数外定义的变量(标识符)或用extern说明的变量(标识符)。 文件作用域:全局变量(标识符)的作用域。从定义位置开始到该源程序文件结束。 当全局变量出现使用在前而说明在后时,要先对全局变量作外部说明,其方法在后面介绍。 通过全局变量,增加了函数之间传递数据的途径,但也使函数的独立性降低。由于一个函数对外部变量的修改,直接影响到其他引用这个变量的函数,因此,外部变量的过多使用,会导致函数间依赖性增强。,局部变量与全局变量同名问题,#include int i=10; /全局变量i void main(void) int i

26、=19,j=50;:i=:i+2; /全局变量ij=:i + i ; /全局变量i、局部变量i和jcout“:i=“:i;/全局变量icout“,i=“i“,j=“jn;/局部变量i和j ,规则1:局部变量在其作用域内,将屏蔽与其同名的全局变量。,程序运行结果: :i=12,i=19,j=31,规则2:在同名局部变量作用域内,用作用域运算符可访问同名的全局变量。,3函数原型作用域,函数原型作用域:函数原型参数表中说明的标识符,其作用域始于说明处,止于函数原型说明的结束处。 函数原型中说明的标识符仅有形式上的意义: 函数原型中说明的标识符可与其定义不同,例如:float f(int x,floa

27、t y);/f( )的原型说明float f(int a,float b) /f( )的定义 return a+b; 函数原型中说明的标识符也可省略,例如:float f(int,float);,4函数作用域,函数作用域:只有标号具有函数作用域,即在一个函数中定义的标号,在其整个函数内均可以引用。 同一函数内不允许标号同名,而在不同函数内允许标号同名。 不允许在一个函数内用goto语句转移到另一个函数内的某一个语句去执行。,6.6.2 存储类型,程序执行时,系统为它分配内存并将它装入内存。 程序占用内存分为: 程序区:存放程序的可执行代码。 静态存储区:存放程序中定义的静态变量。 动态存储区:

28、存放程序中定义的动态变量。动态变量:当程序执行到动态变量的作用域的开始处时,才为它分配内存;而执行到它的作用域的结束处时,收回为它分配的内存。该变量的生命期仅在变量的作用域内。,静态变量:在程序开始执行时就为其分配内存的变量,直到程序执行结束时,才收回为变量分配的内存。静态变量的生命期为程序的执行期,即静态变量一直占用所分配的内存,不管是否处在它的作用域。存储类型:在变量说明时指定,决定何时为变量分配内存,何时收回分给变量的内存,反映了变量占用内存的期限。引入存储类型是为了提高内存使用效率。 变量的存储类型:自动类型、寄存器类型、静态类型和外部类型。,1自动类型变量,自动类型变量:在说明局部变

29、量时,用auto修饰。由于局部变量默认为自动类型变量,因此在说明局部变量时,通常不用auto修饰。 举例:void f(void) int x; /默认为:auto int x;auto int y; 自动类型变量为动态变量,若未赋初值,则其值不定。如上面的变量x和y都没有确定的初值。,2静态类型变量,静态类型变量:用static修饰的变量,为静态变量。在说明静态类型变量时,若没有指定初值,则编译器将其初值置为0。 例如:static float y=4.5f;/静态全局变量y,初值4.5static char s; /静态全局变量s,初值0void f(void) static int x;

30、 /静态局部变量x,初值0coutx,y,sendl;,静态局部变量,静态局部变量:用static修饰的局部变量。要求系统用静态存储方式为该变量分配内存。 静态局部变量的特点:在程序开始执行时,获得所分配的内存,生存期是全程的,作用域是局部的。在调用函数而执行函数体后,系统并不收回这些变量占用的内存,当下次执行函数时,变量仍使用相同的内存,因此,这些变量仍保留原来的值。 静态局部变量的作用:保存函数运行后的结果,以便下次调用函数时,继续使用上次计算的结果。,静态局部变量举例,#includeint f(int i) static int r=1;r*=i;return r;void main(

31、void) for(int i=1;i5;i+)couti“!=“f(i)n;,程序运行结果:1!=12!=23!=64!=24,静态局部变量r 生存期:与程序的执行期相同。 作用域:局限于f( )函数内。 初始化:仅在函数f( )首次调用时。,静态全局变量,全局变量:静态存储类型,其缺省初值为0。静态全局变量:在说明全局变量时,用static修饰。表示所说明的变量仅限于本程序文件内使用。 若一个程序仅由一个文件组成,在说明全局变量时,有无static修饰,并无区别。对于多文件构成的程序来说,如果将仅局限于一个文件中使用的全局变量加static修饰,则能有效避免全局变量的重名问题。,3.寄存器

32、类型变量,寄存器类型变量:用register修饰的局部变量。register指示编译器为这类变量尽可能直接分配CPU中的寄存器,以提高存取速度。 例如:register int i,j; 说明: 寄存器类型变量主要用作循环变量,存放临时值。 静态变量和全局变量不能定义为寄存器类型变量。 有的编译系统把寄存器变量作为自动变量来处理,有的编译系统限制了定义寄存器变量的个数。,4.外部类型变量,外部类型变量:在说明全局变量时,用extern修饰。主要用于下列两种情况: 同一文件中,全局变量使用在前,定义在后,例如:,多文件组成一个程序时,一个源程序文件中定义的全局变量要被其他若干个源程序文件引用时,

33、例如:/c1.cpp#includefloat x;extern float f( ); /外部函数原型声明void main(void) coutf( )n; /c2.cppfloat f( ) /引用性说明外部变量x,使其作用域扩至f函数extern float x; /问:这样声明有何优点?return x+=2;,存储类型小结,基于变量访问的安全性以及内存利用效率等方面的考虑,在实际编程时,优先使用自动变量,严格限制使用静态变量和外部变量,基本不用寄存器变量。 不得不使用静态变量时,优先使用静态局部变量。 不得不使用全局变量时,优先使用静态全局变量。 不得不使用外部变量时,优先采用块作

34、用域对外部变量的作用域做扩展。,6.7 C+增加的函数特性,C+对函数的声明、定义、调用方式和实现机制做了进一步完善和改进,增加了: 内联函数 带缺省参数值的函数 重载函数 函数模板:15.2节介绍。,6.7.1 内联函数,背景:函数调用时都会产生一些额外的时间开销,主要是系统栈的保护、参数的传递、系统栈的恢复等。对于那些函数体很小、执行时间很短但又频繁使用的函数来说,这种额外时间开销很可观。 内联函数机制:不是在调用时发生转移,而是在编译时将函数体嵌入到每个内联函数调用处。这样就省去了参数传递、系统栈的保护与恢复等的时间开销。 内联函数的定义:inline (形参表)函数体,只有简单、频繁调

35、用的函数才有必要说明为内联的。 内联函数的本质:以增加程序代码的存储开销为代价来减少程序执行的时间开销。 内联函数举例:inline void swap(int 内联函数说明: 内联函数一般不能含有循环语句和switch语句。 内联函数的定义必须出现在第一次被调用之前。 内联函数不能指定抛掷异常的类型。 函数用inline修饰只是向编译器提出了内联请求,编译器是否作为内联函数来处理由编译器决定。,6.7.2 缺省参数值的函数,当函数的参数在多数情况下使用相同的值时,为这些参数设定缺省值可以简化函数的调用。 例6.17 具有缺省参数值的延时函数#includevoid delay(int n=1

36、000) for( ;n0;n-); void main(void) cout“延时1000个单位时间n“;delay( );cout“延时800个单位时间n“;delay(800);,使用具有缺省参数的函数时,应注意: 缺省参数的说明必须出现在函数调用之前,说明方法有两种:具有缺省参数值的函数的定义在函数调用之前说明,如例6.17所示。先给出函数的原型说明,并在原型说明中依次列出参数的缺省值,但在后面的函数定义中,不能再指定函数参数的缺省值,如例6.18所示。 参数的缺省值可以是表达式,但应有确定的值。 函数的缺省参数可有多个,但缺省参数应从参数表的最右边依次向左设定。如例6.18中A行不能

37、写为:float Area(float10,float); 同一函数在不同作用域,可用函数原型声明方式提供不同的缺省参数值。,例6.18 输入长方形的长和宽,计算长方形的面积。#includefloat Area(float,float=10);/Avoid main(void) float x, y;coutxy;coutx;cout“第二个长方形的面积=“Area(x);float Area(float l,float w) return l*w; ,6.7.3 函数的重载,函数重载:两个或两个以上的函数同名,但形参的类型或形参的个数有所不同。仅返回值不同,不能定义为重载函数。 函数重载的

38、原则:只有功能相近的函数才有必要重载。互不相干的函数使用函数重载,只会造成混乱,降低程序的可读性。 函数重载的好处:合理使用函数重载可以减轻用户对函数名的记忆负担,方便用户对函数的调用,提高程序的可读性。,函数重载举例,例6.19 重载求平方的函数,实现求整数、单精度浮点数和双精度浮点数的平方值。 #includeint Square(int x) return x*x; /Afloat Square(float x) return x*x; /Bdouble Square(double x) return x*x; /Cvoid main(void) coutSquare(2) /调用A行函数,Square(3.0f) /调用B行函数,Square(4.0); /调用C行函数,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报