函数和作用

上传人:suns****4568 文档编号:106893202 上传时间:2019-10-16 格式:PPT 页数:59 大小:306.50KB
返回 下载 相关 举报
函数和作用_第1页
第1页 / 共59页
函数和作用_第2页
第2页 / 共59页
函数和作用_第3页
第3页 / 共59页
函数和作用_第4页
第4页 / 共59页
函数和作用_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《函数和作用》由会员分享,可在线阅读,更多相关《函数和作用(59页珍藏版)》请在金锄头文库上搜索。

1、第2章 函数和作用域,2.1函数定义和调用 2.2C+函数特性 2.3作用域和存储类型 2.4名称空间,2.1 函数定义和调用,2.1.1函数定义 C+的任何一个程序都可由一个主函数和若干个子函数组合而成。主函数可以调用子函数,子函数还可以调用其他子函数。C+规定主函数名必须是main,而其他函数可以是库函数或自定义函数。 (1)主函数main不仅是程序的入口函数,而且与其他函数相比较还有许多使用上的限制。例如,它不能被其他函数调用,不能用inline和static来说明等。 (2)库函数,又称标准函数,是ANSI/ISO C+编译系统已经预先定义好的函数,程序设计时可根据实际需要,直接使用这

2、类函数,而不必重新定义。调用时,必须在程序中包含相应的头文件,并指明使用名称空间std。,2.1 函数定义和调用,(3)自定义函数是用户根据程序的需要,将某一个功能相对独立的程序定义成的一个函数,或将解决某个问题的算法用一个函数来组织。 与变量的使用规则相同,在C+程序中一定要先说明和定义函数,然后才能调用函数。 C+中每一个函数的定义都是由4个部分组成的,即函数名、函数类型、形式参数表和函数体,其定义的格式如下:,2.1.1 函数定义,其中,函数名应是一个合法有效的C+标识符;函数头的形式参数又简称为形参。 参数表中的每一个形参都是由形参的数据类型和形参名来构成, 根据上述定义格式,可以编写

3、一个函数sum,如图2.1所示,注意它们的书写规范。,图2.1 定义一个函数sum,2.1.1 函数定义,需要说明的是: (1) C/C+不允许在一个函数体中再定义函数,即禁止嵌套定义,但允许嵌套调用。 (2) 函数体也可不含有任何语句,这样的函数称为空函数,它仅为程序结构而设定,本身没有任何操作。 (3) 函数类型决定了函数所需要的返回值类型,它可以是除数组类型之外的任何有效的C+数据类型,包括引用、指针等。,2.1.1 函数定义,(4) 若函数类型为void时,则表示该函数没有返回值。但仍然可以在函数体中使用return语句“return ;”,此时可将“return;”语句理解为是函数体

4、花括号“”的作用,当流程遇到函数体的“”时,函数调用结束,控制权返回给主调函数。例如: void f1( int a) if (a 10) return; / return;一旦执行,后面的语句不再 被执行 当a10条件满足时,“return;”语句将控制权返回给主调函数。,2.1.2 函数的调用和声明,1. 函数的实参和形参 定义一个函数就是为了以后的调用。调用函数时,先写函数名,然后紧跟括号,括号里是实际调用该函数时所给定的参数,称为实际参数,简称实参,并与形参相对应。要注意形参和实参的区别: (1) 从模块概念来说,形参是函数的接口,是存在于函数内部的变量。而实参是存在于函数外部的变量。

5、它们不是同一个实体,也就是说,形参变量和实参变量所对应的内存空间不是同一个内存空间。 (2) 按函数定义时所指定的形参类型,实参除变量外还可以是数值或表达式等,而形参只能是变量。 (3) 形参在函数调用之前是不存在的,只有在发生函数调用时,函数中的形参才会被分配内存空间,然后执行函数体中的语句,而当调用结束后,形参所占的内存空间又会被释放。,2.1.2 函数的调用和声明,2. 函数的调用 函数调用的一般格式为: ( ); 调用函数时要注意:实参与形参的个数应相等,类型应一致,且按顺序对应,一一传递数据。 例如,下面的示例用来输出一个三角形的图案。,2.1.2 函数的调用和声明,例Ex_Call

6、 函数的调用 #include using namespace std; void printline( char ch, int n ) for (int i = 0 ; in ; i+) coutch; coutendl ; int main() int row = 5; for (int i = 0; irow; i+) printline(*, i+1); / A return 0; ,2.1.2 函数的调用和声明,程序运行的结果如下: 代码中,main函数的for循环语句共调用了5次printline函数(A句),每次调用时因实参i+1值不断改变,从而使函数printline打印出来

7、的星号个数也随之改变。,2.1.2 函数的调用和声明,3. 函数的声明 由于前面函数printline的定义代码是放在main函数中调用语句A之前,因而A语句执行不会有问题。 但若将函数printline的定义代码放在调用语句A之后,即函数定义在后,而调用在前,就会产生“printline标识符未定义”的编译错误。 此时必须在调用前进行函数声明。,2.1.2 函数的声明,声明一个函数按下列格式进行: ( ); 可见,函数声明的格式是在函数头的后面加上分号“;”。但要注意,函数声明的内容应和函数的定义应相同。 例如,对于前面sum函数和最后一个printline函数可有如下声明: int sum

8、(int x, int y); void printline( char ch, int n );,2.1.3 值传递,函数的调用实质上就是参数传递, 在C+中,函数的参数传递有两种方式,一是按值传递,二是地址传递或引用传递。 这里先来说明按值传递的参数传递方法,地址传递或引用传递在以后来讨论。 当函数的形参定义成一般变量时,如前面printline和sum函数的形参都是一般变量,此时函数的参数传递就是按值传递方式,简称值传递,是指当一个函数被调用时,C+根据实参和形参的对应关系将实际参数的值一一传递给形参,供函数执行时使用。,2.1.3 值传递,值传递的特点是: (1) 若实参指定是一般变量

9、,则传递的是实参变量的值而不是实参变量的地址。 (2) 在执行函数代码时,由于对实参数据的操作最终是在形参的内存空间中进行,因此形参值的改变只是改变了形参的内存空间存储的值,而不会改变实参变量所对应的内存空间的值。 也就是说,即使形参的值在函数中发生了变化,函数调用结束后,实参的值不会受到影响。例如:,2.1.3 值传递,例Ex_SwapValue 交换函数两个参数的值。 #include using namespace std; void swap(float x, float y); / 函数原型说明 int main() float a = 20, b = 40; cout“a = “a

10、“, b = “b“n“; swap(a, b); / 函数调用 cout“a = “a“, b = “b“n“; return 0; void swap(float x, float y) / 函数定义 float temp; temp = x; x = y; y = temp; cout“x = “x“, y = “y“n“; ,2.1.3 值传递,程序的运行结果为:,可以看出,虽然函数swap中交换了两个形参x和y的值,但交换的结果并不能改变实参的值,所以调用该函数后,变量a和b的值仍然为原来的值。,2.1.4 函数的默认形参值,在C+中,允许在函数的声明或定义时给一个或多个参数指定默认

11、值。这样在调用时,可以不给出实际参数,而按指定的默认值进行工作。 例如: void delay(int loops = 1000) / 函数定义,1000为形 参loops的默认值 if ( 0 = loops) return; for (int i=0; iloops; i+); / 空循环,起延时作用 ,2.1.4 函数的默认形参值,这样,当有调用 delay(); / 和delay(1000)等效 程序就会自动将loops当作成1000的默认值来进行处理。 当然,也可在函数调用时指定相应的实际的参数值, 例如: delay(2000); / 形参loops的值为2000,2.1.4 函数

12、的默认形参值,在设置函数的默认形参值时要注意: (1) 当函数既有原型声明又有定义时,默认参数只能在原型声明中指定,而不能在函数定义中指定。 例如: void delay(int loops); / 函数原型声明 / void delay(int loops = 1000) / 错误:此时不能函数定义中指定默认参数 / ,2.1.4 函数的默认形参值,(2) 当一个函数中需要有多个默认参数时,则形参分布中,默认参数应严格从右到左逐次定义和指定,中间不能跳开。 例如: void display(int a, int b, int c = 3); / 合法 void display(int a,

13、int b = 2, int c = 3); / 合法 void display(int a = 1, int b = 2, int c = 3); / 合法:可以对所有的参数设置默认值 void display(int a, int b = 2, int c); / 错误:默认参数应从最右边开始 void display(int a = 1, int b = 2, int c); / 错误:默认参数应从最右边开始 void display(int a = 1, int b, int c = 3); / 错误:多个默认参数中间不能有非默认参数,2.1.4 函数的默认形参值,(3) 当带有默认参

14、数的函数调用时,系统按从左到右的顺序将实参与形参结合。 当实参的数目不足时,系统将按同样的顺序用声明或定义中的默认值来补齐所缺少的参数。 例如:,2.1.4 函数的默认形参值,例Ex_Default 在函数定义中设置多个默认参数 #include using namespace std; void display(int a, int b = 2, int c = 3) / 在函数定义中设置默认参数 cout“a = “a“, b = “b“, c = “c“n“; int main() display(1); display(1, 5); display(1, 7, 9); return 0

15、; 程序的运行结果为:,2.2 C+函数特性,在C+中,函数还有:嵌套调用、重载、内联调用以及递归调用等特性,相应的函数被称为嵌套函数、重载函数、内联函数和递归调用等。,2.2 C+函数特性,函数重载(overloaded)是C+对C的扩展,它允许多个同名的函数存在,但同名的各个函数的形参必须有区别:要么形参的个数不同;要么形参的个数相同,但参数类型有所不同。 优点:代码中使用函数的重载,不仅方便函数名的记忆,而且更主要的是完善了同一个函数的代码功能,给调用带来了许多方便。 下例程序中即是各种形式的sum函数都称为sum的重载函数。,2.2 C+函数特性,【例Ex_OverLoad】 编程求两

16、个或三个操作数之和 #include int sum(int x, int y); int sum(int x, int y, int z); double sum(double x, double y); double sum(double x, double y, double z); /声明4个同名的函数 int main() coutsum(2, 5)endl; / 结果为7 coutsum(2, 5, 7)endl; / 结果为14 coutsum(1.2, 5.0, 7.5)endl; / 结果为13.7 return 0; 程序的运行结果为:,2.2 C+函数特性,int sum(int x, int y) return x+y; int sum(int x, in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号