b函数与运算符的重载

上传人:平*** 文档编号:48806663 上传时间:2018-07-20 格式:PPT 页数:106 大小:1.19MB
返回 下载 相关 举报
b函数与运算符的重载_第1页
第1页 / 共106页
b函数与运算符的重载_第2页
第2页 / 共106页
b函数与运算符的重载_第3页
第3页 / 共106页
b函数与运算符的重载_第4页
第4页 / 共106页
b函数与运算符的重载_第5页
第5页 / 共106页
点击查看更多>>
资源描述

《b函数与运算符的重载》由会员分享,可在线阅读,更多相关《b函数与运算符的重载(106页珍藏版)》请在金锄头文库上搜索。

1、第5章 函数与运算符的重载5.1 5.2 5.3 函数的嵌套与递归 5.4 函数与运算符的重载 5.5 函数与C+程序结构 5.6 程序实例1问题1,为什么要用函数2,使用函数的程序和顺序程序有什 么区别?25.3.1函数的嵌套函数的嵌套 一个函数的函数体中包含一个或多个函数调用语句,即称为函数嵌 套 。n嵌套的含义是,如果函数A 要调用函数B,也就是说,函数A 的 定义要依赖于函数B 的定义。因此函数B 的定义或函数B 的原型 必须出现在函数A 的定义语句之前。n另一方面,函数A 调用函数B,在调用A 的过程中,即执行A 的 函数体过程中,调用B,也就是中途把程序控制转到B 的函数体 ,在执

2、行结束后再返回到A 的函数体中。n函数嵌套调用所占用的空间(如赋值参数的创建等等)用堆栈( stack)的方式管理。一般这种堆栈所分配的空间是有限的,因 此函数互相嵌套的层数也是有限的,依编译系统不同,其允许的 嵌套层数也可能不同。 3函数调用的堆栈情况堆栈Main( )cuberoot( x ) 参数传递、返回值保护现场、恢复现场调用返回4实例# include void f1 (int,int); void f2 (int); void main () int a, b ;cout a ;cout b;f1 (a, a+b); cout 1时, n!=n*(n-1)! 这正是我们编写求n的

3、阶乘的递归函数prod的基础。9#include long prod(int n) /注意用的是long,课本p131(3)if ( n=1 )return 1; /n等于1时,递归出口(“退出”递归)elsereturn n * prod(n-1); / n大于1时的返回值(n!)为n乘以n-1的阶乘/ ( 使用自递归调用“prod(n-1)”来求出(n-1)! )10void main( ) int n;coutn; /输入的正整数放入n中long p=prod(n); /求出n的阶乘放入p中cout int sum(int n) /递归函数sumif ( n=1 ) /n等于1时,递归出

4、口 return 1;elsereturn n + sum(n-1); /n大于1时的返回值(累加和)为n加上“从1累加到 /n-1的和”(要使用递归调用求出前n-1个数的累加 和)16void main( ) int n;coutn; int s=sum(n); /求出从1累加到n的和放s 中cout void inv (int n) int i; cini;/输入 if (n1) inv (n-1); /递归else cout int conv(int n)if (n t;cout ,= , , , 等 315.4.2 可重载运算符(1)可重载运算符几乎包含了C+的全部运算符集,例外的是:

5、限定 符.,:,条件运算符?:,取长度运算符sizeof 它们不可重载 (2)在可重载的运算符中有几种不同情况: 算术运算符,逻辑运算符,位运算符等与基本数据类型有关,通过 运算苻重载函数的定义,使它们可以用于某些用户定义的数据类型 ,这是重载的主要目的。 赋值运算符,关系运算符,!等所涉及的数据类型按C+程 序规定,并非只限于基本数值类型。因此,这些运算符可以自动地 扩展到任何用户定义的数据类型,一般不需作重载定义就可“自动 ”地实现重载。 单目运算符+和-实际上各有两种用法,前缀增(减)量和后缀增 (减)量。其运算符重载函数的定义当然是不同的,对两种不同的 运算无法从重载函数的原型上予以区

6、分:函数名(operator +)和 参数表完全一样。为了区别前缀+和后缀+,C+语言规定,在后缀 +的重载函数的原型参数表中增加一个int 型的无名参数。 325.4.3 运算符重载函数的定义运算符的重载是一个特殊函数定义过程,这类 函数总是以operator作为函数名。其实 例在第七章以后引进 假设程序中定义了一个枚举类型的bool 类型:enum boolFALSE,TRUE; 用运算符(双目),*(双目),(单目)来 表示或、与、非运算是十分方便的:335.4.3 运算符重载函数的定义bool operator + (bool a ,bool b) if(aFALSE)(bFALSE)

7、return FALSE;return TRUE;bool operator*(bool a,bool b) if(aTRUE)(bTRUE)return TRUE; return FALSE; bool operator-(bool a) if(aFALSE) return TRUE;return FALSE; 我们可以在程序中方便的 表示其运算:b1b1+b2;b1-b3;b1(b1+b3)* FALSE;345.4.3 运算符重载函数的定义运算符重载函数的调用可有两种方式: 1 与原运算符相同的调用方式,如上例中的b1+b2, b1*b2,等等。 2 一般函数调用方式,如b1+b2,也可

8、以写为 operator+(b1,b2)被重载的运算符的调用方式,优 先级和运算顺序都与原运算符一致,其运算分量的个 数也不可改变。 3 运算符重载主要用于用类的形式定义的用户定义类 型,例如,复数类型,集合类型,向量类型等等,通 过运算符重载把人们习惯的运算符引入到计算操作之 中,会收到很好的效果。这样的实例将在第七章介绍 。 355.5 函数与C+程序结构5.5.1库函数的使用库函数又称标准函数,是C+语言编译系统为 用户提供的内部函数,其编写与一般用户定义 的函数相同,程序员可在程序中直接使用,但 是要在程序开头说明库函数所在的头文件名, 例如:#include #include C+系

9、统中有一个很大的标准函数库(和标准 类库),包括许多在各种程序中常用的基本任 务处理函数,这些库函数被分成不同的组,例 如,数学计算、字符处理、字符串处理、I/O操 作、图形处理等等, 365.5.2 SP框架结构按结构程序设计(SP)思想设计的程序结构称为SP框 架。函数是SP框架的核心。一个SP框架的完整C+程序由下面几部分组成:n1)一个主函数。它可调用其它函数,但不能被调用。n2)任意多个用户定义函数。都处于同一“等级”,可 以互相调用。n3)全局说明。在所有函数定义之外的变量说明和函数 原型。n4)预处理命令。在进行预处理后,这部分被取代。n5)注释。只起方便阅读的作用,编译后被删除

10、。375.5.2 SP框架结构对于比较大的程序,可以把它们划分为几个程序文件 ,这些程序模块可能由一个或多个程序员编写,最简 单而有效的划分方法是:n 根据主函数和各用户定义的函数的功能及相互关 系,把它们划分成若干个.CPP文件。n 按与每个.CPP 程序文件中的函数有关的全局说明 组成一个或多个.h(头)文件。n 程序中使用的库函数组成的若干.CPP 文件和对应 的.h 文件。在预处理命令的帮助下,一个C+程序被 划分为若干.CPP和.h程序文件。在包含命令的帮助下 ,这些文件形成了一个有机的整体。n在这样的模块结构中,各个.CPP文件是全部函数的划 分,它们组成了程序代码的主体。385.

11、5.3 函数间的数据传递1. 通过赋值参数和返回语句(单向)2通过全局变量(双向)3.通过指针类型参数和引用参数(双向)4.函数的数组类型参数(双向)391 通过赋值参数 (“单向传递”方式)传值方向只是:“上层” =“下层”。也即 ,可从主调函数A中通过赋值参数所对应的实参将 值“传入”到被调函数B内(去使用),但不可将被 调函数B内改变后的参数值“传出”到主调函数A中 (去接着使用)。系统处理方式为: 被调函数中对形 参值的改变不影响主调函数处的任一变量的值(形 参分配有自己的局部于被调函数的存储空间,调用 入口处将实参表达式的值赋给该局部变量)。 40通过函数返回值(“单向传递”方式)

12、通过函数内使用的return语句, 可将被调函数B内计算出的最终值“传出”到主调函数A的“调用点”处(去接着使用)。也即,传值方向只是:“下层” =“上层”。 41全局变量的定义域可延续到整个程序执行结束,因此,只 要在函数中没有把该全局变量名说明为其它变量,在所有 的函数中都可以直接访问它,也就是说,函数间的数据传 递还可以通过全局变量实现,这种传递可以是双向的 可从主调函数A中通过全局变量将值“传入”到 被调函数B内(在A中赋值, 进入B内后使用该值), 又可将被调函数B内改变后的全局变量值“传出” 到主调函数A中(去接着使用)。也即,传值方向可 为:“上层” =“下层”,“下层” =“上

13、层 ”。2 通过全局变量(“双向传递”方式)423 通过引用参数(“双向传递”方式 ,有关引用的其它使用方法详见第6章)传值方向可为:“上层” =“下层”,“ 下层” =“上层”。即是说,它不仅可向被调 函数的形参“传入”值(调用时的实参值),而且 还可通过该形参“传出”值。系统处理方式为: 被调函数中对形参值的使用与改变,就是对主调 函数中调用语句处所对应实参变量值的直接使用 与改变(形参不具有自己的局部于被调函数的存 储空间,它只是实参变量的一个“替身”)。434 通过数组参数或指针参数(“双向传递”方式,指针参数的具体使用方法见第6章)传值方向可为:“上层” =“下层”, “下层” =“

14、上层”。数组作形参,且在被调函数内使用或改 变数组元素的值。系统处理方式为: 对形参 数组元素的使用与改变,就是对实参数组元 素的直接使用与改变。指针作形参,且在被调函数内使用或改 变指针所指变量的值。系统处理方式为: 被 调函数中对形参指针所指变量值的使用与改 变,就是对实参指针所指变量值的直接使用 与改变。 44数组可作为函数参数,从而把主调函 数中的整个数组(实际上是数组的首地址) 传给了被调函数。而后可在被调函数中使 用或改变传来的那些数组元素的值。但注 意,若在被调函数内改变数组元素值的话 ,返回主调函数后,相应实参数组元素的 值也进行了相同的改变(“双向传值”功 能)。 数组参数4

15、5例1. 读如下程序,看执行 后会显示出什么结果?#include void ProcessingFunc(int b, int num); /函数原型 /int型数组形参b,通常省去对元素个数的指定 /(当然也可以进行指定!) void main() int A10=0,1,2,3,4,9,8,7,66,88; coutint sum(int a, int n) if ( n=1 )return a0;elsereturn ( an-1 + sum(a, n-1) );51void main() const int n=6; int An; coutAi; int s = sum(A, n); cout , . , ;其中的“”可以是auto、register、 extern、static四个关键字之一。C+程序的数据主要存放在如下两个数据区之中, 一个称为静态数据区(也称全局数据区 - “一旦分配,一直拥有”),另一个称为动态数据区(也称堆栈数 据区 - “入时分配并拥有,出时归还两手空”)。56具有程序级作用域以及文件级作用域的那些变量被分配在静态数据区之中。另外,具有static存储类别的变量也均被分配在静态数据区之中。在程序执行时,就为这种变量分配空间并进行隐式初始化(将数值量初始化为0,将字符量初始化为空格),直到程序执行结束时才释放这些存储空间。具有

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

当前位置:首页 > 中学教育 > 教学课件

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