收藏 分销(赏)

函数与运算符的重载省公共课一等奖全国赛课获奖课件.pptx

上传人:精*** 文档编号:4149066 上传时间:2024-08-02 格式:PPTX 页数:106 大小:843.27KB
下载 相关 举报
函数与运算符的重载省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共106页
函数与运算符的重载省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共106页
函数与运算符的重载省公共课一等奖全国赛课获奖课件.pptx_第3页
第3页 / 共106页
函数与运算符的重载省公共课一等奖全国赛课获奖课件.pptx_第4页
第4页 / 共106页
函数与运算符的重载省公共课一等奖全国赛课获奖课件.pptx_第5页
第5页 / 共106页
点击查看更多>>
资源描述

1、第第5 5章章 函数与运算符重载函数与运算符重载5.1 5.1 .5.2 5.2 .5.3 5.3 函数嵌套与递归函数嵌套与递归5.4 5.4 函数与运算符重载函数与运算符重载5.5 5.5 函数与函数与C+C+程序结构程序结构5.6 5.6 程序实例程序实例1第1页问题问题1 1,为何要用函数,为何要用函数2 2,使用函数程序和次序程序有什么区,使用函数程序和次序程序有什么区分?分?2第2页5.3.15.3.1函数嵌套函数嵌套n函数嵌套n一个函数函数体中包含一个或多个函数调用语句,即称为函数嵌套。n嵌套含义是,如果函数A 要调用函数B,也就是说,函数A 定义要依赖于函数B 定义。所以函数B

2、定义或函数B 原型必须出现在函数A 定义语句之前。n其次,函数A 调用函数B,在调用A 过程中,即执行A 函数体过程中,调用B,也就是中途把程序控制转到B 函数体,在执行结束后再返回到A 函数体中。n函数嵌套调用所占用空间(如赋值参数创建等等)用堆栈(stack)方式管理。一般这种堆栈所分配空间是有限,所以函数互相嵌套层数也是有限,依编译系统不一样,其允许嵌套层数也可能不一样。3第3页 函数调用堆栈情况函数调用堆栈情况 堆栈堆栈Main()cuberoot(x)参数传递、返回值参数传递、返回值保护现场、恢复现场保护现场、恢复现场调用调用返回返回4第4页实例实例#include void f1(

3、int,int);void f2(int);void main()int a,b;cout a;cout b;f1(a,a+b);cout endl a+b endl;void f1(int x,int y)int m=2;x*=m;y+;f2(x+y)/m);void f2(int p)if(p=100)cout endl 1n1时,时,n!=n*(n-1)!n!=n*(n-1)!这正是我们编写求这正是我们编写求n n阶乘递归函数阶乘递归函数prodprod基础。基础。9第9页#include#include long prod(int n)/long prod(int n)/注意用是注意用

4、是longlong,书本书本p131p131(3 3)if(n=1)if(n=1)return return 1;1;/n/n等等于于1 1时时,递递归归出出口口(“(“退退出出”递递归归)else elsereturn n*return n*prod(n-1)prod(n-1);/n/n大于大于1 1时返回值时返回值(n!)n!)为为n n乘以乘以n-1n-1阶乘阶乘/(/(使用自递归调用使用自递归调用“prod(n-1)prod(n-1)”来求出来求出(n-1)!)n-1)!)10第10页void main()void main()int n;int n;coutInput a posit

5、ive integer:;coutn;cinn;/输入正整数放入输入正整数放入n n中中 long p=prod(n);/long p=prod(n);/求出求出n n阶乘放入阶乘放入p p中中 coutp=1*.*n=pendl;coutp=1*.*n=pendl;/输出结果输出结果p p 11第11页 上上述述求求阶阶乘乘递递归归函函数数中中,当当主主函函数数经经过过prod(3)prod(3)对对递递归归函函数数prodprod进进行行调调用用时时,它它返返回回值值为为3*3*prod(2)prod(2),此此时时系系统统将将再再一一次次对对prodprod本本身身进进行行调调用用而而形

6、形成成递递归归调调用。用。但但注注意意后后一一次次调调用用实实参参为为2 2,比比上上一一次次实实参参3“3“下下降降”了了1 1。而而计计算算prod(2)prod(2)时时,它它返返回回值值为为2*2*prod(1)prod(1),此此时时系系统统将将再再一一次次对对prodprod本本身身进进行行递递归归调调用用,但但此此时实参又时实参又“下降下降”了了1 1。12第12页 正正是是经经过过这这种种实实参参逐逐次次“下下降降”,可可保保障障递递归归函函数数在在执执行行若若干干次次后后(此此时时求求阶阶乘乘问问题题当当“下下降降”到到1 1时时),能能够够“退退出出”递递归归(不不再再进进

7、行行递递归归调调用用,也即实现了递归出口也即实现了递归出口)。因因 为为 prod(1)prod(1)返返 回回 值值 为为 1 1,系系 统统 深深 入入 算算 出出2*2*prod(1)prod(1)值值(即即prod(2)prod(2)值值)为为2*1=22*1=2,再再深深入入算算出出3*3*prod(2)prod(2)值值为为3*2=63*2=6,这这正正是是prod(3)prod(3)调调用用返返回回值值(也即求出了也即求出了3!=3*2*1=6)3!=3*2*1=6)。13第13页 即即使使上上述述执执行行过过程程是是由由系系统统自自动动完完成成,但但程程序序员员要要了了解解并并

8、熟熟知知这这种种调调用用机机制制与与系系统统实实现现方方法法,从而才能编写出逻辑正确且简明易懂递归处理程序。从而才能编写出逻辑正确且简明易懂递归处理程序。另另外外注注意意,递递归归处处理理程程序序执执行行速速度度通通常常要要比比非非递归处理方法慢。递归处理方法慢。问题:为何会慢?问题:为何会慢?14第14页 求出求出1 1到到n n之累加和递归函数之累加和递归函数sumsum 使程序执行后输出结果为使程序执行后输出结果为:Input a positive integer:Input a positive integer:100100s=1+.+100=5050s=1+.+100=505015第

9、15页#include include int sum(int n)int sum(int n)/递归函数递归函数sumsum if(n=1)if(n=1)/n/n等于等于1 1时,递归出口时,递归出口return 1;return 1;else else return n+return n+sum(n-1)sum(n-1);/n/n大于大于1 1时返回值时返回值(累加和累加和)为为n n加上加上“从从1 1累加到累加到/n-1/n-1和和”(”(要使用要使用递归调用递归调用求出前求出前n-1n-1个数累加和个数累加和)16第16页 void main()void main()int n;in

10、t n;coutInput a positive integer:;coutn;cinn;int s=sum(n);/int s=sum(n);/求出从求出从1 1累加到累加到n n和放和放s s中中 couts=1+.+n=sendl;couts=1+.+n=sendl;17第17页2 2 反序输出从键盘输入反序输出从键盘输入1010个整数个整数 反反序序输输出出:从从键键盘盘输输入入10 10 个个int int 型型数数,而后按输入相反次序输出它们。而后按输入相反次序输出它们。比如:比如:输入:输入:1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 输出

11、:输出:10 9 8 7 6 5 4 3 2 110 9 8 7 6 5 4 3 2 118第18页 2 2 反序输出从键盘输入反序输出从键盘输入1010个整数个整数#include void inv(int n)int i;cini;/输入输入if(n1)inv(n-1);/递归递归 else cout“-The result-”endl;/递归出口递归出口 cout i“”;/输出输出void main(void)coutInput 10 integers:endl;inv(10);coutendl;19第19页 2 2 反序输出从键盘输入反序输出从键盘输入1010个整数个整数n能够有下面

12、执行结果:能够有下面执行结果:nInput 10 integers:Input 10 integers:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 10-The result-The result-10 9 8 7 6 5 4 3 2 110 9 8 7 6 5 4 3 2 120第20页 3 3 反序输出一个整数反序输出一个整数 在许多情形下递归函数易写易读,像解著名在许多情形下递归函数易写易读,像解著名Hanoi Hanoi 塔问题递归函数,其递归程序很短,塔问题递归函数,其递归程序很短,也极易了解也极易了解(见见5.6 5.6 节节),不过,假如不用递,不

13、过,假如不用递归方法,程序将十分复杂,极难编写。归方法,程序将十分复杂,极难编写。要求要求 反序输出一个正整数各位数值,反序输出一个正整数各位数值,如输入如输入231231,应输出,应输出132132。21第21页 3 3 反序输出一个整数反序输出一个整数#include int conv(int n)if(n10)coutn;return;/递归出口递归出口 cout n%10;conve(n/10);/递归递归 void main(void)int t;cout t;cout endl;conv(t);22第22页 3 3 反序输出一个整数反序输出一个整数输出结果为:Input a pos

14、itive number:47811874假如不用递归函数设计,程序不如递归形式清楚:int conv(int n)if(n0)cout “Please input a positive number!”;else do cout n%10;n=/10;while(n!=0);23第23页 总结总结(1)(1)不论是直接递偿还是间接递归都必须确保在有不论是直接递偿还是间接递归都必须确保在有限次调用之后能够结束。比如函数限次调用之后能够结束。比如函数fac fac 中参数中参数n n 在递归调用中每次减在递归调用中每次减1 1,总可到达,总可到达2 2 状态而结束。状态而结束。(2)(2)函数调

15、用时系统要付出时间和空间代价,在环函数调用时系统要付出时间和空间代价,在环境条件相同情形下,总是非递归程序效率较高。境条件相同情形下,总是非递归程序效率较高。24第24页 5.4 5.4 函数和运算符重载函数和运算符重载5.4.1 5.4.1 函数重载函数重载5.4.2 5.4.2 可重载运算符可重载运算符5.4.3 5.4.3 运算符重载函数定义运算符重载函数定义25第25页 5.4.1 5.4.1 函数重载函数重载 函数重载实际上是函数名重载,即支持多个不一样函数采取同一函数重载实际上是函数名重载,即支持多个不一样函数采取同一名字。名字。比如:比如:int absint abs(int n

16、int n)returnreturn(n n0 0?-n-n:n n;float abs float abs(float ffloat f)ifif(f f0 0)f f-f-f;return freturn f;double abs double abs(double ddouble d)ifif(d d0 0)return-dreturn-d;return dreturn d;三个函数都是求绝对值,采取同一个函数名,更符合人们习惯三个函数都是求绝对值,采取同一个函数名,更符合人们习惯 .比如在程序中经常出现这么情况:对若干种不一样数据类型求和,比如在程序中经常出现这么情况:对若干种不一样数

17、据类型求和,即使数据本身差异很大(比如整数求和,向量求和,矩阵求和)即使数据本身差异很大(比如整数求和,向量求和,矩阵求和),详细求和操作差异也很大,但完成不一样求和操作函数却能,详细求和操作差异也很大,但完成不一样求和操作函数却能够取相同名字(比如够取相同名字(比如sumsum,add add 等)。打印函数等)。打印函数printprint,显示函,显示函数数displaydisplay等也是一样。等也是一样。26第26页 5.4.1 5.4.1 函数重载函数重载 函数名重载并不是为了节约标识符(标识符函数名重载并不是为了节约标识符(标识符数量是足够),而是为了方便程序员使用,数量是足够)

18、,而是为了方便程序员使用,这一点很主要。实现函数重载必须满足以下这一点很主要。实现函数重载必须满足以下条件之一:条件之一:n(1 1)参数表中对应参数类型不一样;)参数表中对应参数类型不一样;n(2 2)参数表中参数个数不一样;)参数表中参数个数不一样;n(3 3)参数表中不一样类型参数次序不一样。)参数表中不一样类型参数次序不一样。27第27页 5.4.1 5.4.1 函数重载函数重载比如:比如:void printvoid print(intint););/整型整型 void print void print(pointpoint););/类类point point 对象对象 int su

19、mint sum(int int,intint););int sum int sum(int int,int int,intint););int get int get(int nint n,float a float a););int get int get(int nint n,float a float a,int nint n););28第28页 5.4.1 5.4.1 函数重载函数重载在定义同名函数时应注意:在定义同名函数时应注意:n(1 1)返回类型不能区分函数,)返回类型不能区分函数,float addfloat add(int floatint float););int add

20、int add(int floatint float););/错误错误 n(2 2)采取引用参数不能区分函数,)采取引用参数不能区分函数,void printvoid print(doubledouble););void printvoid print(doubledouble);/);/错误错误 n(3 3)有些派生基本类型参数即使能够区分同名函数,但在)有些派生基本类型参数即使能够区分同名函数,但在使用中必须注意使用中必须注意 n(4 4)包含可缺省参数时,可能造成二义性,)包含可缺省参数时,可能造成二义性,29第29页 5.4.1 5.4.1 函数重载函数重载nC+C+对函数重载处理过程

21、:对函数重载处理过程:(1 1)经过数组名与指针变量,函数名与函数指针,某类型变)经过数组名与指针变量,函数名与函数指针,某类型变量与量与const const 常量之间转换,再查是否可实现匹配;常量之间转换,再查是否可实现匹配;(2 2)把实参类型从低到高(按字长由短到长)进行基本类型)把实参类型从低到高(按字长由短到长)进行基本类型及其派生类型转换,再检验是否可匹配;及其派生类型转换,再检验是否可匹配;(3 3)查有没有已定义可变个数参数函数,如有把它归为该函)查有没有已定义可变个数参数函数,如有把它归为该函数。数。在进行上述尝试性处理之后可能出现仍无匹配或匹配不唯一在进行上述尝试性处理之

22、后可能出现仍无匹配或匹配不唯一情况,这时可能输出犯错信息或错误地运行。情况,这时可能输出犯错信息或错误地运行。30第30页 5.4.2 5.4.2 可重载运算符可重载运算符C+C+语言中运算符实际上是函数方便表示形式,语言中运算符实际上是函数方便表示形式,比如,算术运算符比如,算术运算符”+”+”也能够表示为函数形式:也能够表示为函数形式:int add(int a,int b)return a+b;int add(int a,int b)return a+b;这时,这时,a+b a+b 和和 add(a,b)add(a,b)含义是一样。含义是一样。C+C+语言要求,大多数运算符都能够重载,语

23、言要求,大多数运算符都能够重载,单目运算符:单目运算符:-,!,!,+,-,newnew,deletedelete双目运算符:双目运算符:+,-,*,=,!=!=,=-,=,等等 31第31页 5.4.2 5.4.2 可重载运算符可重载运算符(1 1)可重载运算符几乎包含了)可重载运算符几乎包含了C+C+全部运算符集,例外是:限定符全部运算符集,例外是:限定符.,:,:,条件运算符?:,取长度运算符,条件运算符?:,取长度运算符sizeof sizeof 它们不可重载它们不可重载 (2 2)在可重载运算符中有几个不一样情况:)在可重载运算符中有几个不一样情况:算术运算符,逻辑运算符,位运算符等

24、与基本数据类型相关,经过运算术运算符,逻辑运算符,位运算符等与基本数据类型相关,经过运算苻重载函数定义,使它们能够用于一些用户定义数据类型,这是算苻重载函数定义,使它们能够用于一些用户定义数据类型,这是重载主要目标。重载主要目标。赋值运算符,关系运算符,!等所包括数据类型按赋值运算符,关系运算符,!等所包括数据类型按C+C+程序要程序要求,并非只限于基本数值类型。所以,这些运算符能够自动地扩展求,并非只限于基本数值类型。所以,这些运算符能够自动地扩展到任何用户定义数据类型,普通不需作重载定义就可到任何用户定义数据类型,普通不需作重载定义就可“自动自动”地实地实现重载。现重载。单目运算符单目运算

25、符+和和-实际上各有两种使用方法,前缀增(减)量和后缀实际上各有两种使用方法,前缀增(减)量和后缀增(减)量。其运算符重载函数定义当然是不一样,对两种不一样增(减)量。其运算符重载函数定义当然是不一样,对两种不一样运算无法从重载函数原型上给予区分:函数名(运算无法从重载函数原型上给予区分:函数名(operator+operator+)和参)和参数表完全一样。为了区分前缀数表完全一样。为了区分前缀+和后缀和后缀+,C+C+语言要求,在后缀语言要求,在后缀+重载函数原型参数表中增加一个重载函数原型参数表中增加一个int int 型无名参数。型无名参数。32第32页 5.4.3 5.4.3 运算符重

26、载函数定义运算符重载函数定义 运算符重载是一个特殊函数定义过程,这类函数运算符重载是一个特殊函数定义过程,这类函数总是以总是以operatoroperator 作为函数名。其实例在作为函数名。其实例在第七章以后引进第七章以后引进 假设程序中定义了一个枚举类型bool 类型:enum boolFALSE,TRUE;用运算符(双目),*(双目),(单目)来表示或、与、非运算是十分方便:33第33页 5.4.3 5.4.3 运算符重载函数定义运算符重载函数定义bool operator+(bool a,bool b)if(aFALSE)()(bFALSE)return FALSE;return TR

27、UE;bool operator*(bool a,bool b)if(aTRUE)()(bTRUE)return TRUE;return FALSE;bool operator-(bool a)if(aFALSE)return TRUE;return FALSE;我们能够在程序中方便表示我们能够在程序中方便表示其运算:其运算:b1b1b1+b2b1+b2;b1b1-b3-b3;b1b1(b1+b3b1+b3)*FALSEFALSE;34第34页 5.4.3 5.4.3 运算符重载函数定义运算符重载函数定义运算符重载函数调用可有两种方式:运算符重载函数调用可有两种方式:1 1 与原运算符相同调用

28、方式,如上例中与原运算符相同调用方式,如上例中b1+b2b1+b2,b1*b2b1*b2,等等。等等。2 2 普通函数调用方式,如普通函数调用方式,如b1+b2b1+b2,也能够写为,也能够写为operator+operator+(b1b1,b2b2)被重载运算符调用方式,优先级)被重载运算符调用方式,优先级和运算次序都与原运算符一致,其运算分量个数也不和运算次序都与原运算符一致,其运算分量个数也不可改变。可改变。3 3 运算符重载主要用于用类形式定义用户定义类型,比运算符重载主要用于用类形式定义用户定义类型,比如,复数类型,集合类型,向量类型等等,经过运算如,复数类型,集合类型,向量类型等等

29、,经过运算符重载把人们习惯运算符引入到计算操作之中,会收符重载把人们习惯运算符引入到计算操作之中,会收到很好效果。这么实例将在第七章介绍。到很好效果。这么实例将在第七章介绍。35第35页 5.5 5.5 函数与函数与C+C+程序结构程序结构5.5.15.5.1库函数使用库函数使用 库函数又称标准函数,是库函数又称标准函数,是C+C+语言编译系统为用语言编译系统为用户提供内部函数,其编写与普通用户定义函数户提供内部函数,其编写与普通用户定义函数相同,程序员可在程序中直接使用,不过要在相同,程序员可在程序中直接使用,不过要在程序开头说明库函数所在头文件名,比如:程序开头说明库函数所在头文件名,比如

30、:#include#include#include#include C+系统中有一个很大标准函数库(和标准类库),包含许多在各种程序中惯用基本任务处理函数,这些库函数被分成不一样组,比如,数学计算、字符处理、字符串处理、I/O操作、图形处理等等,36第36页 5.5.2 SP5.5.2 SP框架结构框架结构 按结构程序设计(按结构程序设计(SPSP)思想设计程序结构称为)思想设计程序结构称为SPSP框架。框架。函数是函数是SPSP框架关键。框架关键。一个一个SPSP框架完整框架完整C+C+程序由下面几部分组成:程序由下面几部分组成:n1 1)一个主函数。它可调用其它函数,但不能被调用。)一个主

31、函数。它可调用其它函数,但不能被调用。n2 2)任意多个用户定义函数。都处于同一)任意多个用户定义函数。都处于同一“等级等级”,能,能够相互调用。够相互调用。n3 3)全局说明。在全部函数定义之外变量说明和函数原)全局说明。在全部函数定义之外变量说明和函数原型。型。n4 4)预处理命令。在进行预处理后,这部分被取代。)预处理命令。在进行预处理后,这部分被取代。n5 5)注释。只起方便阅读作用,编译后被删除。)注释。只起方便阅读作用,编译后被删除。37第37页 5.5.2 SP5.5.2 SP框架结构框架结构 对于比较大程序,能够把它们划分为几个程序文件,对于比较大程序,能够把它们划分为几个程序

32、文件,这些程序模块可能由一个或多个程序员编写,最简单这些程序模块可能由一个或多个程序员编写,最简单而有效划分方法是:而有效划分方法是:n 依据主函数和各用户定义函数功效及相互关系,依据主函数和各用户定义函数功效及相互关系,把它们划分成若干个把它们划分成若干个.CPP.CPP文件。文件。n 按与每个按与每个.CPP.CPP 程序文件中函数相关全局说明组成程序文件中函数相关全局说明组成一个或多个一个或多个.h.h(头)文件。(头)文件。n 程序中使用库函数组成若干程序中使用库函数组成若干.CPP.CPP 文件和对应文件和对应.h.h 文件。在预处理命令帮助下,一个文件。在预处理命令帮助下,一个C+

33、C+程序被划分为若程序被划分为若干干.CPP.CPP和和.h.h程序文件。在包含命令帮助下,这些文件程序文件。在包含命令帮助下,这些文件形成了一个有机整体。形成了一个有机整体。n在这么模块结构中,各个在这么模块结构中,各个.CPP.CPP文件是全部函数划分,文件是全部函数划分,它们组成了程序代码主体。它们组成了程序代码主体。38第38页 5.5.5.3 5.3 函数间数据传递函数间数据传递 1.1.经过赋值参数和返回语句(单向)经过赋值参数和返回语句(单向)2 2经过全局变量(双向)经过全局变量(双向)3.3.经过指针类型参数和引用参数(双向)经过指针类型参数和引用参数(双向)4.4.函数数组

34、类型参数(双向)函数数组类型参数(双向)39第39页1 1 经过赋值参数经过赋值参数(“(“单向传递单向传递”方式方式)传值方向只是:传值方向只是:“上层上层”=“”=“下层下层”。也即,。也即,可从主调函数可从主调函数A A中经过赋值参数所对应实参将值中经过赋值参数所对应实参将值“传传入入”到被调函数到被调函数B B内内(去使用去使用),但不可将被调函数,但不可将被调函数B B内改变后参数值内改变后参数值“传出传出”到主调函数到主调函数A A中中(去接着使去接着使用用)。系统处理方式为。系统处理方式为:被调函数中对形参值改变不被调函数中对形参值改变不影响主调函数处任一变量值影响主调函数处任一

35、变量值(形参分配有自己局部于形参分配有自己局部于被调函数存放空间,调用入口处将实参表示式值赋被调函数存放空间,调用入口处将实参表示式值赋给该局部变量给该局部变量)。40第40页 经过函数返回值经过函数返回值(“(“单向传递单向传递”方式方式)经过函数内使用经过函数内使用returnreturn语句语句,可可将被调函数将被调函数B B内计算出最终值内计算出最终值“传出传出”到主调函数到主调函数A A“调用点调用点”处处(去接着使去接着使用用)。也即,传值方向只是:。也即,传值方向只是:“下层下层”=“=“上层上层”。41第41页 全局变量定义域可延续到整个程序执行结束,所以,只要全局变量定义域可

36、延续到整个程序执行结束,所以,只要在函数中没有把该全局变量名说明为其它变量,在全部函数在函数中没有把该全局变量名说明为其它变量,在全部函数中都能够直接访问它,也就是说,函数间数据传递还能够经中都能够直接访问它,也就是说,函数间数据传递还能够经过全局变量实现,这种传递能够是双向过全局变量实现,这种传递能够是双向 可从主调函数可从主调函数A A中经过全局变量将值中经过全局变量将值“传入传入”到到被调函数被调函数B B内内(在在A A中赋值中赋值,进入进入B B内后使用该值内后使用该值),又,又可将被调函数可将被调函数B B内改变后全局变量值内改变后全局变量值“传出传出”到主调到主调函数函数A A中

37、中(去接着使用去接着使用)。也即,传值方向可为:。也即,传值方向可为:“上上层层”=“”=“下层下层”,“下层下层”=“”=“上层上层”。2 经过全局变量经过全局变量(“双向传递双向传递”方式方式)42第42页 3 3 经过引用参数经过引用参数(“(“双向传递双向传递”方式,方式,相关引用其它使用方法详见第相关引用其它使用方法详见第6 6章章)传值方向可为:传值方向可为:“上层上层”=“”=“下层下层”,“下下层层”=“”=“上层上层”。即是说,它不但可向被调函数。即是说,它不但可向被调函数形参形参“传入传入”值值(调用时实参值调用时实参值),而且还可经过,而且还可经过该形参该形参“传出传出”

38、值。系统处理方式为值。系统处理方式为:被调函数被调函数中对形参值使用与改变,就是对主调函数中调用中对形参值使用与改变,就是对主调函数中调用语句处所对应实参变量值直接使用与改变语句处所对应实参变量值直接使用与改变(形参不形参不含有自己局部于被调函数存放空间,它只是实参含有自己局部于被调函数存放空间,它只是实参变量一个变量一个“替身替身”)”)。43第43页 4 4 经过数组参数或指针参数经过数组参数或指针参数(“(“双向传递双向传递”方式,指针参数详细使用方法见第方式,指针参数详细使用方法见第6 6章章)传值方向可为:传值方向可为:“上层上层”=“”=“下层下层”,“下层下层”=“”=“上层上层

39、”。数组作形参,且数组作形参,且在被调函数内使用或改变在被调函数内使用或改变数组元素数组元素值值。系统处理方式为。系统处理方式为:对形参数组元对形参数组元素使用与改变,就是对实参数组元素直接使用素使用与改变,就是对实参数组元素直接使用与改变。与改变。指针作形参,且指针作形参,且在被调函数内使用或改变在被调函数内使用或改变指针所指变量指针所指变量值值。系统处理方式为。系统处理方式为:被调函数被调函数中对形参指针所指变量值使用与改变,就是对中对形参指针所指变量值使用与改变,就是对实参指针所指变量值直接使用与改变。实参指针所指变量值直接使用与改变。44第44页 数组可作为函数参数,从而把主调函数数组

40、可作为函数参数,从而把主调函数中整个数组中整个数组(实际上是数组首地址实际上是数组首地址)传给了被传给了被调函数。调函数。而后可在被调函数中而后可在被调函数中使用使用或或改变改变传传来那些数组元素值来那些数组元素值。但注意,若在被调函数。但注意,若在被调函数内改变数组元素值话,返回主调函数后,对内改变数组元素值话,返回主调函数后,对应实参数组元素值也进行了相同改变(应实参数组元素值也进行了相同改变(“双双向传值向传值”功效)。功效)。数组参数数组参数45第45页例例1.1.读以下程序,看执行读以下程序,看执行后会显示出什么结果后会显示出什么结果?#include include void Pr

41、ocessingFunc(int b,int num);/void ProcessingFunc(int b,int num);/函数原型函数原型/intint型数组形参型数组形参b b,通常省去对元素个数指定通常省去对元素个数指定/(/(当然也能够进行指定当然也能够进行指定!)!)void main()void main()int A10=0,1,2,3,4,9,8,7,66,88;int A10=0,1,2,3,4,9,8,7,66,88;cout-before calling,ai=-n;cout-before calling,ai=-n;for(int i=0;i10;i+)for(i

42、nt i=0;i10;i+)coutAi ;coutAi ;coutendl;coutendl;46第46页 ProcessingFunc(A,10);/ProcessingFunc(A,10);/函数调用函数调用cout-after calling,ai=-cout-after calling,ai=-n;n;for(i=0;i10;i+)for(i=0;i10;i+)coutAi ;coutAi ;coutendl;coutendl;47第47页 void ProcessingFunc(int b,int num)void ProcessingFunc(int b,int num)/数组形

43、参数组形参b b,省去了对元素个数指定省去了对元素个数指定!cout-in ProcessingFunc,bi=-n;cout-in ProcessingFunc,bi=-n;for(int i=0;inum;i+)for(int i=0;inum;i+)coutbi ;coutbi ;coutendl;coutendl;int tmp=b0;int tmp=b0;b0=bnum-1;b0=bnum-1;bnum-1=tmp;bnum-1=tmp;b1+=100;b1+=100;48第48页程序执行后显示结果以下:程序执行后显示结果以下:-before calling,ai=-before c

44、alling,ai=-0 1 2 3 4 9 8 7 66 880 1 2 3 4 9 8 7 66 88-in ProcessingFunc,bi=-in ProcessingFunc,bi=-0 1 2 3 4 9 8 7 66 880 1 2 3 4 9 8 7 66 88-after calling,ai=-after calling,ai=-88 101 2 3 4 9 8 7 66 088 101 2 3 4 9 8 7 66 049第49页例例2.2.求求a a数组中前数组中前n n个整数个整数累加和递归函数累加和递归函数sumsum其中使用了数组形参加递归函数。其中使用了数组形

45、参加递归函数。程序执行后输出结果为程序执行后输出结果为:Input 6 integers:Input 6 integers:22 4-2 9 100 322 4-2 9 100 3s=136s=13650第50页#include#include int sum(int a,int n)int sum(int a,int n)if(n=1)if(n=1)return a0;return a0;elseelse return(an-1+return(an-1+sum(a,n-1)sum(a,n-1););51第51页 void main()void main()const int n=6;cons

46、t int n=6;int An;int An;coutInput n integers:endl;coutInput n integers:endl;for(int i=0;in;i+)for(int i=0;iAi;cinAi;int s=sum(A,n);int s=sum(A,n);couts=sendl;couts=sendl;52第52页 程序中出现全部名字(标识符)都必须说明,每个程序中出现全部名字(标识符)都必须说明,每个名字(变量名、常量名、参数名、函数名、类名、名字(变量名、常量名、参数名、函数名、类名、对象名等)都在程序一定范围内有意义,就是该名对象名等)都在程序一定范围

47、内有意义,就是该名字作用域。字作用域。1.1.外部存放属性与静态存放属性外部存放属性与静态存放属性2 2名字生存期与作用域名字生存期与作用域5.5.4 5.5.4 变量与函数作用域变量与函数作用域53第53页 一一个个C+C+程程序序由由一一个个主主函函数数和和若若干干用用户户定定义义函函数数(或或类类)组组成成,当当程程序序规规模模较较大大时时,整整个个程程序序可可能能被被划划分分为为几几个个程程序序文文件件,关关键键字字extern(extern(外外部部存存放放属属性性)和和static(static(静静态态存存放放属属性性)能能够够要要求求所所说说明明变变量量名名或或函函数数名名作作

48、用用域域在在一一个个程程序序文文件件范范围围内内还还是是扩扩展展到到程序文件之外。程序文件之外。外部存放属性与静态存放属性外部存放属性与静态存放属性54第54页 C+C+存放类别存放类别 存存放放类类别别主主要要是是针针对对变变量量而而言言。变变量量不不但但含含有有数数据据类类型型(存存放放空空间间大大小小),而而且且还还含含有有存存放放类类别别(所占存放空间期限,即生命期)。(所占存放空间期限,即生命期)。变变量量存存放放类类别别可可分分为为以以下下四四种种:自自动动(auto)auto)型型、存存 放放 器器(register)register)型型、外外 部部(extern)extern

49、)型型、静静 态态(static)static)型。型。55第55页 使用显式存放类别时,变量说明普通格式变为:使用显式存放类别时,变量说明普通格式变为:,1,.,;n;其其中中“”能能够够是是autoauto、registerregister、externextern、staticstatic四个关键字之一。四个关键字之一。C+C+程程序序数数据据主主要要存存放放在在以以下下两两个个数数据据区区之之中中,一一个个称称为为静静态态数数据据区区(也也称称全全局局数数据据区区 -“一一旦旦分分配配,一一直直拥拥有有”),另另一一个个称称为为动动态态数数据据区区(也也称称堆堆栈栈数数据据区区 -“-

50、“入时分配并拥有,出时偿还两手空入时分配并拥有,出时偿还两手空”)。)。56第56页 含含有有程程序序级级作作用用域域以以及及文文件件级级作作用用域域那那些些变变量量被被分分配配在在静静态态数数据据区区之之中中。另另外外,含含有有staticstatic存存放放类类别别变变量量也也均均被被分分配配在在静静态态数数据据区区之之中中。在在程程序序执执行行时时,就就为为这这种种变变量量分分配配空空间间并并进进行行隐隐式式初初始始化化(将将数数值值量量初初始始化化为为0 0,将将字字符符量量初初始始化化为为空空格格),直直到到程程序序执执行行结结束束时时才才释释放放这这些些存存放放空间。空间。含含有有

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服