C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数

上传人:E**** 文档编号:89382071 上传时间:2019-05-24 格式:PPT 页数:61 大小:547KB
返回 下载 相关 举报
C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数_第1页
第1页 / 共61页
C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数_第2页
第2页 / 共61页
C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数_第3页
第3页 / 共61页
C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数_第4页
第4页 / 共61页
C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数》由会员分享,可在线阅读,更多相关《C++程序设计 教学课件 ppt 作者 任化敏 chapter06-函数(61页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计 第一部分:C+程序设计语言基础,第六章 函数,第六章 函数,函数概述 参数传递和返回值 变量的作用域和存储类型 内联函数 重载函数,6.1 函数概述,在编写大型的复杂的程序时,需要根据问题需求逐步细化并对程序进行划分,对重复的或者功能独立的程序段也要进行独立设计。这些被划分出来的功能相对独立的程序段就可以构成函数(function)。 一个C+程序可以由若干个函数构成,这些函数可以分别存在于不同的源文件中。当使用这些函数时通过语句进行调用。 在这些函数中有且只能有一个main函数。,#include using namespace std; float max(float,flo

2、at); int main() float ave1,ave2,ave3; cinave1; cinave2; cinave3; cout“平均分较高的班级分数为:“max(max(ave1,ave2),ave3)endl; return 0; ,float max(float x,float y) float z; z=xy?x:y; return z; ,6.1.1 函数定义,一个函数由函数头和函数体两部分构成,函数定义的一般形式如下:,函数返回值类型说明符 函数名(类型说明符 形式参数,) 声明语句 执行语句 ,函数头 函数头由函数返回值类型、函数名和形参列表构成。 其中函数返回值类型可

3、以是C+中的某种数据类型,也可以是指针类型,如果函数没有返回值要使用关键字void作为函数类型说明符。 函数名是每个函数必须具备的,它遵循2.3章节中的标识符命名规则。 函数定义时圆括号中的参数是形式参数,简称形参。形参列表中可以没有变量,也可以有多个变量,多个变量之间用逗号隔开。 定义函数时函数名后面的圆括号()是不能省略的。 函数头不是语句,后面不能有分号。,函数体 函数体需要由花括号括起来,其中包括声明语句和执行语句。 声明语句主要是变量声明和函数声明语句。 执行语句由实现函数功能的语句组成。,6.1.2 函数的声明,在一个函数中要调用另一个函数时,需要在调用之前对被调用函数进行声明。

4、函数声明也被称作函数原型,是一条语句,在语句中需要指出函数返回值的类型、函数的名称以及函数要接收的参数的个数、顺序和类型。 通过函数声明,可以通知编译系统在对包含函数调用的语句进行编译时,根据声明的内容对被调用的函数进行检查。 在程序中如果被调用的函数是标准库函数,则函数原型在头文件中提供,根据所使用的函数的类型,用文件包含指令#include包含函数原型所在的头文件。 如果被调用的函数是用户自定义的函数,程序员需要在程序代码中声明函数原型。,函数声明的一般格式为: 在函数声明语句中,形参名会被编译系统忽略掉,所以在函数声明语句中可以没有形参名,只包含参数类型就可以了。,函数返回值类型说明符

5、函数名 (参数类型说明符 形式参数,);,进一步解释:,函数声明语句与函数定义中的函数头非常相似,但二者不能混淆。函数声明是一条语句以分号结束;而函数头并不是一个独立的语句。 函数声明要与函数定义的返回值类型、函数名以及参数列表完全一致,否则会发生错误。 如果函数定义在首次调用函数之前,则可以不说明函数原型。,6.1.3 函数的调用,函数调用的一般形式为: 通常情况下,可用两种方式调用函数: 如果被调用函数只是执行某些操作而没有返回值,那么可以将函数调用作为一条独立的语句。 函数调用可以作为表达式的一部分出现在程序语句中。,函数名(参数列表);,函数的返回值也称函数值。它返回的不是函数本身而是

6、一个具体的值。 函数返回值的类型由函数声明中函数返回值类型决定。 如果返回的类型与函数声明的不同,则以函数声明类型为准,在返回值时进行隐式转换,然后再返回。 函数的返回值是通过return语句返回到主函数中的。 在被调用函数中遇到return语句时,系统会创建一个临时变量,并复制return语句中的表达式的值给临时变量,函数返回值返回给主函数的就是这个临时变量的值。 对void类型的函数也可以使用return语句,但是return后面不能带任何表达式。,6.1.4 函数的默认参数值,(1)实参和形参 函数的参数有形式参数和实际参数之分。 形式参数是指在函数定义中放在函数名后面圆括号中的参数,简

7、称形参。 函数在没有被调用前系统是不给形参分配存储单元的,只有在函数调用时形参才获得内存单元,它的有效范围在定义它的函数体内,属于局部变量。退出函数时,形参所占有的内存单元就被释放掉了。 实际参数是指在调用函数的语句中圆括号中的参数,简称实参。实参是一个具有确定值的常量、变量或表达式。,例如在定义函数的语句float max(float x,float y)中的x和y就是形式参数,而函数调用语句ave=max(ave1,ave2) 中ave1和ave2是实际参数。在函数调用时,将实参ave1的值传递给形参x,将实参ave2的值传递给形参y,如图所示。,6.1.4 函数的默认参数值,(2) 函数

8、的默认参数值 在C+函数声明中可以声明一个或多个带有默认值的参数。调用函数时,如果省略了相应的实参,那么编译器会把默认值作为实参的值。 例如,可以使用下面的语句声明具有默认值的C+函数原型: void newFunc(int a=3,double b=2.16); 在这个函数声明中声明了参数的默认值,如果调用函数时省略了实参,那么编译器就会使用这些默认参数值。,例【6-1】利用具有默认参数值的函数输出用户指定个数的符号。,#include using namespace std; void func1(int a=15,char c=*); int main() cout“第一行:输出15个*

9、“endl; func1(); cout“第二行:输出25个*“endl; func1(25); cout“第三行:输出35个#“endl; func1(35,#); return 0; void func1(int a,char c) int i; for(i=1;i=a;i+) coutc; coutendl; ,提示:,在调用具有默认参数值的函数时要按照函数声明中参数列表顺序传递数据,所以如果某个参数不能省略,那么它左边的参数值都不能省略。 例如在上面的程序中如果按照下面这种方式调用函数func1就是错误的: func1(,=); /第二个参数没有省略,那么第一个参数也不能省略 所以在编

10、写函数时可以把参数值经常变化的参数放在参数列表左边,把参数值不会经常发生变化的参数放在参数列表的右边。,6.2 参数传递和返回值,6.2.1指针作函数的参数和返回值 6.2.2 引用作函数参数和返回值 6.2.3 数组形参 6.2.4 vector形参,C+程序在向函数传递参数时,传递的是参数的值而不是对参数的引用。也就是函数把实参的一个副本存储到对应的形参当中参与被调用函数的运算,这种方式被称为值传递。 值传递的最大特点就是函数处理的是实参的副本,因此不会影响实参的值,被调用的函数的形参的运算结果不会返回给主调函数的实参。 但是有些时候,例如要处理大型的结构时值传递的效率是低下的;或者有些时

11、候函数需要修改实参的值。对于这些情况函数的值传递是无法解决的, 可以使用另外两种方法来处理,一种是参数被声明成指针;另一种方法是把参数声明成引用。,6.2.1指针作函数的参数和返回值,使用指针变量作为函数的形参时,需要使用指针变量或者地址作为实参。这时实参和形参之间传递的不是普通变量的值,而是这个变量的地址值。 使用指针作为函数参数时,实参和形参共同指向某个变量的地址,所以在函数调用时可以使保存在这个地址中的变量的值发生改变,并且在主调函数中可以得到和使用这些值。,例【6-2】利用指针形参改变实参的值。,#include #include using namespace std; void s

12、wap(string *p1,string *p2); int main() string s1,s2; s1=“sNumber“; s2=“sName“; cout“转换前:s1=“s1“,s2=“s2endl; swap( ,分析:,在主函数中调用函数swap(),实参是s1和s2的地址,将这两个地址值传递给形参p1和p2, 这时p1指向s1,p2指向s2,如图(a)所示;*p1就是s1,*p2就是s2,将*p1与*p2的值进行互换实际就是将s1和s2的值互换,如图(b)所示;调用完成后p1和p2的内存单元被释放掉,但是s1和s2的值已经被交换了。,6.2.1指针作函数的参数和返回值,当一

13、个函数声明其返回值为一个指针时,实际是将一个地址返回给调用函数,并把它用在相应的表达式中,这类函数被称为指针函数。,例【6-3】利用指针函数求数组中的最大值。,#include using namespace std; int *max(int b10); int main() int a10; int *p; int i; coutai; p=max(a); cout“数组中的最大值是: “*pendl; return 0; int *max(int b10) int *m,j,t; t=b0; for(j=0;j10;j+) if(tbj) t=bj; m=b+j; return m; ,

14、6.2.2 引用作函数参数和返回值,引用作为函数形参与指针作为函数形参的作用有些类似,它们都可以改变实参的值或返回其他的结果。,例【6-4】用引用作形参改写例6-2程序。,#include #include using namespace std; void swap(string ,分析:,在这个程序中,调用函数swap()时,实参s1和s2的值分别传递给形参r1和r2,此时r1和r2就是s1和s2的别名。 这里要注意的是,r1和r2不占用临时存储空间,它们分别对应s1和s2的存储单元,所以引用作为函数参数进行传递时也可以看作是地址传递; 这样对r1和r2进行交换实际上就是对s1和s2进行交

15、换。,既然指针作为函数参数和引用作为函数参数都是地址传递,它们都可以改变实参的值,那么它们二者有什么不同呢? 引用是一个变量的别名,一旦初始化后它就与初始化它的变量绑定在一起。 而指针却可以指向多个对象也可以不指向任何对象。 所以如果一个参数在函数中可能要指向不同的对象或者不指向任何对象时,就必须使用指针形参了。,6.2.2 引用作函数参数和返回值,引用既可以做函数的参数,也可以作为函数的返回值。这时函数返回的不是值而是某个变量或对象的引用,所以return后面应该是变量名。而这个变量不能是函数中的局部变量,因为函数在调用结束后会释放掉局部变量,所以被引用的变量或对象应该是全局的或静态的。,例

16、【6-5】编写函数返回两个班级平均分中较高分的引用。,#include using namespace std; int ,6.2.3 数组形参,数组是占有连续内存地址的相同类型的数据项序列。使用数组元素作为函数实参与使用普通变量作实参是一样的,都是值传递。如果函数要对批量的数据进行处理,使用数组元素作为参数是不方便的,这时可以使用数组作为函数的形参。 数组名代表这个数组的起始地址,在使用数组名时实际上使用的是指向该数组第一个元素的指针。 将数组作为参数传递给函数时,实际上传送的就是这个指针,而不是数组的副本。与指针形参相同,在被调函数内对数组参数的改变将应用到数组实参上。,例【6-6】利用数组形参打印课程表。,#include #include using namespace std; /声明一个函数,输入课程表 void GetCurriculumSchedule(string courese

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

当前位置:首页 > 高等教育 > 大学课件

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