版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.1函数的定义、说明和调用5.1.1return语句return语句用于函数的返回或返值。当程序执行到return语句时,系统将终止该段程序的执行,返回到调用该函数的“断点”处继续执行原程序。return语句通常位于一个函数的最后一行。return语句有带参数和不带参数两种形式。不带参数的return语句的格式为:return;其功能是:返回到调用该函数的“断点”处继续执行原程序。当函数用void声明时,说明该函数没有返回值,应该使用不带参数的return语句。不带参数的return语句也可以省略。下一页返回5.1函数的定义、说明和调用当程序执行该函数的最后一个语句后,遇到函数的结束标识“}”就自动返回到调用这个函数的“断点”处继续执行原程序。无返回值的函数调用必须是函数调用语句。带参数的return语句的格式为:return表达式;其功能是:当程序执行到return表达式时,系统先计算“表达式”的值,然后将表达式的值返回给调用该函数的函数上一页下一页返回5.1函数的定义、说明和调用5.1.2函数的定义函数的定义就是编写完成某种功能的程序段。一个C++语言函数的定义形式如下:[存储属性][返值类型]函数名([形式参数表]){[变量的定义]
[被调函数的说明]语句;[返回语句;]}上一页返回下一页5.1函数的定义、说明和调用一个C++语言函数由函数头和函数体两部分组成。函数头由函数的存储属性,函数的返值类型,函数名和形式参数表组成。(1)函数的存储属性决定了函数的存在性和可见性。函数的定义总是在其他函数的外部,所以函数的存储属性一般都是外部型的,和外部变量一样,函数具有全局的存在性。外部型函数在其他函数的内部都是可见的,即外部函数可以被其他函数调用。函数也可以是静态型,静态型函数与静态变量具有相同的存储属性,它具有全局的存在性和局部的可见性。函数的存储属性缺省时,编译程序将其按外部型处理。下一页返回上一页5.1函数的定义、说明和调用(2)返值类型就是函数返回数值的数据类型。当函数返值是数值时,函数的数据类型可以是带符号或不带符号的char、int、short及long型和float、double型等。当返值是地址值时,函数的数据类型是指针类型。当函数无返值时,C++规定其类型是void类型。(3)函数名是由用户命名的符合标识符规定的标识符。通常采用能描述函数功能的英文单词、其缩写或是汉语拼音。(4)形式参数表指明函数所具有的参数的数据类型、个数及其顺序,它们是函数被调用时用于接收实在参数的变量。上一页下一页返回5.1函数的定义、说明和调用5.1.3函数说明
(1)被调函数必须是已经存在的库函数或用户自己定义的功能函数。
(2)如果使用库函数,一般应在本文件开头用#include命令将调用有关库函数时需要用的信息包含到本文件中来。(3)如果调用用户自己定义的函数,且该函数与调用它的主调函数在同一个文件中,一般应该在主调函数中对被调函数作函数原型说明,也就是函数说明。上一页下一页返回5.1函数的定义、说明和调用函数说明的一般形式是:
函数返值类型被调函数名(形参表);
注意:函数的定义和说明是两码事。函数定义是对函数的确立,它包括指定函数的存储属性,返值数据类型,函数名,形式参数和函数体等,它是一个独立的完整的函数单位。而函数说明只是对已定义函数的原型进行说明,它只包括函数返值数据类型,函数名和一对圆括号及其形式参数。对被调函数进行说明的作用是告诉系统,在本函数中将要用到的某函数是何种类型,以便在主调函数中按此数据类型对被调函数作相应处理。上一页下一页返回5.1函数的定义、说明和调用5.1.4函数调用
一个函数调用另一个函数时称为函数调用。函数调用可以作为运算分量在表达式中出现;也可以加上分号变成函数调用语句。函数调用的一般形式是:
函数名(实在参数表);
其中函数名就是我们要调用的函数名字,实在参数就是我们调用被调函数时所要处理的数据,实在参数还可以是被处理数据的地址。实在参数在传值时可以是常量、变量,甚至可以是表达式。但它们一定要具备实在的数值。实在参数必须与被调函数形式参数的数据类型、个数和顺序相一致,字符型和整型,实型和长实型可视为同一类型。上一页下一页返回5.1函数的定义、说明和调用在函数调用过程中,随着流程控制的转移,实在参数的值赋予相应的形式参数。也可以这样说:实在参数的值是对形式参数初始化的初值。在有些资料中称为换元或代真。
调用一个函数,只需知道函数的功能,它的形式参数和返值的性质和意义,就能正确地调用它。对于函数是如何完成功能的并不需要了解,从使用者的角度看,被调函数相当于一个“黑盒子”,只需掌握钥匙,即函数的功能、形式参数和返值的含义就行了。
函数的黑盒子特性为软件的模块化设计、集体开发、函数的综合利用和函数库的建立都提供了极大的便利。上一页下一页返回5.1函数的定义、说明和调用C++语言程序是由若干个相对独立的函数组成,但是各个函数所处理的数据往往是同一批数据,犹如一条加工流水线,要生产的产品是一定的,而各个环节所完成的处理又各不相同。程序中的函数虽然是离散的,但被处理的数据却是连续的,数据贯穿若干函数之间,以达到一定的处理目的。在程序的运行期间,函数之间必然存在着数据的相互传递过程。在C++语言中,函数间的数据传递可以使用参数、返值和全局部变量进行。上一页返回5.2函数间的数据传递在一个函数中调用另一个函数时,实在参数的值传递给被调函数的形式参数,这样就实现了数据由主调函数向被调函数的传递。在使用参数传递数据时,C++语言有三种不同的方法:数据复制、地址传递和引用传递,也称为传值方法、传址方法和传引用方法。还有三种函数间的结果传递:利用外部变量、利用引用和利用指针。返回下一页5.2函数间的数据传递5.2.1函数间的数值传递
传值方法在函数间传递数据,就是把变量的数据或数据的本身作为实在参数传递给形式参数。5.2.2函数间的地址传递
使用参数传递数据的另一种方式是传递地址的传址方式。这时作为参数传递的不是数据的本身,而是数据所在的内存单元的地址。在这种方式中,以数据的存储地址作为实在参数调用一个函数,而被调函数的形式参数必须是可以接收地址的指针变量(关于指针变量将在第6章中介绍),并且它的数据类型必须与被传递地址中数据的数据类型相同。下一页返回上一页5.2函数间的数据传递5.2.3函数间的引用传递
所谓引用,就是给一个已知的变量起一个别名,对引用的操作实质上就是对被引用变量的操作。引用的定义格式为:数据类型&引用名=已定义的变量名(或对象名);
其中,引用名是为所引用的变量起的别名,要符合C++语言标识符的规定,数据类型就是它所引用目标的数据类型。
引用在声明时就要对其初始化,即是指定该引用是哪个对象的别名,引用一旦声明,对应目标的地址就是该引用的地址。作为函数形参引用将有主调函数的实参对其初始化。上一页下一页返回5.2函数间的数据传递5.2.4全局变量传递函数处理结果
在函数外部定义的变量是外部变量,外部变量又称为全局变量,它具有全局的作用域和生命期,即它在源文件中的所有函数中都是可见的,所以,利用全局变量的这个特性可以在函数间传递函数处理的结果。上一页下一页返回5.2函数间的数据传递5.2.5利用指针、引用返回函数处理的结果
除了可以利用全局变量返回函数处理的结果外,还可以利用指针和引用返回函数处理的结果。
使用传址方式时,在被调函数中对形式参数的任何修改,都及时反映给主调函数中作为实在参数的对应变量,也可以说被调函数对传址参数的修改就是对实参变量的直接修改。利用这一特点,我们可以在被调函数中把处理结果送入传址参数的存储单元。当流程由被调函数返回到主调函数时,主调函数可以通过该参数的存储单元得到数据的处理结果。上一页返回下一页5.2函数间的数据传递数组是多个同类型数据的有序数据集合。在C++语言中,经常需要把数组传递给被调函数进行处理。向函数传递数组时,C++语言不能把整个数组作为一个参数传递给被调函数的另一个数组中。如果采用传值方式向被调函数传递数组,只能把数组的每一个元素作为一个参数传递给被调函数的对应参数。当数组元素较多时,若要把它们全部传递给被调函数必须要用到大量的参数,要想这样传递几乎是不可能的。
采用传址方式可以圆满地解决数组大量元素在函数间的传递问题。在这种方式下,把数组的存储区域的首地址作为实在参数传递给被调函数,在被调函数中以指针变量作为形式参数接收数组的首地址。该指针被赋予数组的首地址后,它就指向了数组的存储空间,在被调函数中,可以使用指针对数组中的所有元素进行处理。返回上一页5.3函数的嵌套调用与递归调用5.3.1函数的嵌套调用所谓函数的嵌套调用,就是函数A调用函数B,函数B又调用函数C,……。在函数嵌套调用时,函数的返回,要逐级返回到上一级调用本级函数的“断点”处继续执行原来中断的原程序。函数的嵌套调用与返回如图5−1所示。下一页返回5.3函数的嵌套调用与递归调用5.3.2函数的递归调用
在C++语言中把直接或间接调用自身的函数称为递归函数。在数学中,有许多数学公式都是用递归形式进行定义的。上一页下一页返回5.3函数的嵌套调用与递归调用一个问题要采用递归方法解决必须符合两个条件:其一是可以把问题转化为一个新的问题,而新的问题的解决方法仍与原问题的解法相同,只是所处理的对象有规律地递增或递减,其二有一个明确地结束递归的条件。
递归算法简单而自然,源程序代码紧凑。但是递归调用有两个缺点是不容忽视的。其一是递归并不能节省存储空间,从源代码文件看虽然源代码简短,但在每次递归过程中都将产生一组对应的新变量,必须建立一个存储堆栈,用以保存原来调用函数“现场”的那些变量。上一页下一页返回5.3函数的嵌套调用与递归调用其二是递归也不能加快程序的运行速度,而是不同程度地降低了速度。这是因为在每次递归调用过程中,必须将有关变量、数据送入堆栈保存,而每次退出一层递归调用时,又必须对有关变量进行“现场”恢复工作。但是在内存容量、运行速度不是主要矛盾,又能利用递归算法描述时,还是应尽量采用递归函数。上一页返回5.4内联函数5.4.1内联函数的格式及应用
内联函数不是在函数调用时发生转移,而是在编译阶段将函数体嵌入到每一个调用语句处。这样将可节省参数的传递、控制转移等方面的开销,其处理方式很像带参的宏。
内联函数有两种格式:
(1)显式说明。
inline函数返值类型
函数名(行参表)
{函数体;}(2)隐式说明。在类说明的内部定义函数,函数返值类型前面可以没有“inline”,此时系统也将按内联函数处理。下一页返回5.4内联函数5.4.2内联函数要注意的问题
使用内联函数要注意:内联函数的定义必须出现在第一次被调用之前;内联函数体内一般不能有循环语句、switch语句和goto语句;内联函数内不能定义静态变量;内联函数内不能声明数组;内联函数不能定义为递归函数;对内联函数不能进行异常接口声明。
通常内联函数应是比较小、结构简单、语句少的函数。如果将一个复杂的函数定义为内联函数,多数编译器都会自动将其转换为普通函数进行处理。上一页返回5.5带默认参数的函数5.5.1带默认参数的函数应用[例5.17]带默认参数函数应用举例#include<iostream.h>#include<iomanip.h>intget_volume(intlength,intwidth=2,intheight=3)intmain(){intx=10,y=12,z=15;cont<<“矩形相关的参数和体积为:”;cont<<get_volume(x,y,z)<<endl;cont<<“矩形相关的参数和体积为:”;cont<<get_volume(x,y)<<endl;下一页返回5.5带默认参数的函数cont<<“矩形相关的参数和体积为:”;cont<<get_volume(x)<<endl;cont<<矩形相关的参数和体积为:”;cont<<get_volume(x,7)<<endl;cont<<矩形相关的参数和体积为:”;Cont<<get_volume(5,5,5)<<endl;return0;}intget_volume(intlength,intwidth,intheight){cont<<setw(5)<<lenth<<setw(5)<<width<<setw(5)<<height<<“;”;上一页下一页返回5.5带默认参数的函数returnlength*width*height;}【例5.17】程序的运行结果为:矩形相关的参数和体积为:101215;1800矩形相关的参数和体积为:10123;360矩形相关的参数和体积为:1023;60矩形相关的参数和体积为:1073;210矩形相关的参数和体积为:555;125上一页下一页返回5.5带默认参数的函数5.5.2调用默认参数函数应注意的问题
带默认参数函数的有一定的规定:
带默认形参值的函数其默认参数必须从右向左顺序给定。函数调用出现在函数定义之前,默认参数要在函数原型说明中给出,反之,默认参数要在函数定义中给出。
在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。上一页返回5.6变量的生存期、作用域和命名空间变量的生存期是指特定变量存在的时间。在C++语言中,变量的生和动态生存期。变量的作用域是指变量存在的情况下该变量是否可以访问。在C++中,变量的作用域可以分为文件作用域,类作用域和局部作用域。命名空间是ANSIC++引入的可以由用户命名的作用域,用于处理程序中常见的同名冲突问题。存期分为静态生存期下一页返回5.6变量的生存期、作用域和命名空间5.6.1变量的生存期
在第2章已经讲过变量声明的一般格式,其实变量声明语句的完整格式应为:
[存储属性]数据类型
变量名1,变量名2,…,变量名n;
存储属性表明变量在内存的区域,除了有自动(auto)、外部、静态(static)三种属性外,若是整数类型还可以是寄存器(register)属性。
外部属性一般由变量定义的物理位置确定,通常是在所有大括号对之外,该变量具有全局的生命期和全局的作用域。上一页下一页返回5.6变量的生存期、作用域和命名空间静态(static)属性作用于外部变量,该变量具有全局的生命期和文件的作用域,也就是该变量在该文件中可见;若作用于局部变量时,该变量具有全局的生命期和局部的作用域。
自动(auto)属性一般是在大括号对内定义的变量,该变量具有局部的生命期和局部的作用域,当一个变量在大括号对内定义时,auto关键字可以省略。若是整型变量,对其访问的次数频繁,可以将其定义为register属性,该属性是将变量存储于CPU内的寄存器中,一般允许两个,在定义多个时,系统将超过部分作为自动型处理。
上一页下一页返回5.6变量的生存期、作用域和命名空间在C++语言中变量有静态生存期和动态生存期的问题。如果对象的生存期与程序的运行期间相同,则该对象具有静态的生存期。在文件作用域内定义的对象具有静态的生存期;在块作用域内定义的对象要具有静态的生存期,需要在定义对象的时候在前面加上“static”关键字。动态生存期就是对象的创建与撤销是在块的范围之内。其生存期从对象定义点开始,到包围该对象定义的大括号结束。上一页下一页返回5.6变量的生存期、作用域和命名空间5.6.2变量的作用域
在某个函数中定义的变量就只能在这个函数中引用,这就是变量的作用域问题。变量的作用域讨论的是一个标识符起作用的范围。C++变量的作用域可以分为:函数原型作用域,局部作用域,文件作用域、全局作用域和对象族作用域。1.函数原型作用域
所谓函数原型作用域就是在函数说明时形式参数的作用范围。上一页返回5.6变量的生存期、作用域和命名空间2.局部作用域
定义在大括号内的变量一般称为局部变量,局部变量的作用域从说明变量处开始,一直到块结束的大括号为止。3.全局作用域或文件作用域
在大括号之外定义的变量具有全局的生存期和全局的作用域,这种变量的作用域开始于变量定义点,结束于本文件。若是多文件系统,用extern说明,还可以在其他文件中引用。
如果一个全局变量在定义时其数据类型前面冠以“static”关键字,该变量具有全局的生存期和本文件的作用域,也就是该变量只能在定义它的文件中引用。下一页返回5.6变量的生存期、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026盘锦事业编面试题及答案
- 2026燃气泄漏面试题及答案
- 2026色彩部门面试题目及答案
- 2026上学问题面试题及答案
- 2026十个明确面试题及答案
- 美容院解约合同范本
- 会员商户核销协议书
- 坡地纠纷协议书模板
- 孩子放弃抚养协议书
- 援助台湾协议书
- 2026中国华电集团有限公司湖南分公司本部面向系统内公开招聘5人笔试历年常考点试题专练附带答案详解
- 华南理工大学2026年强基计划面试模拟试题及答案解析
- 宝宝换牙教学课件
- 国家开放大学一网一平台电大《建筑测量》实验报告1-5题库
- 非织造学-第九章-熔喷工艺课件
- 舒曼《交响练习曲》详解
- 某立交桥维修加固(实施)施工组织设计设计
- GB/T 19355-2003钢铁结构耐腐蚀防护锌和铝覆盖层指南
- 磁共振医师三基考试题库与答案
- 部编人教版七年级上册历史重要考点复习课件
- 受限(有限)空间作业安全施工方案
评论
0/150
提交评论