第05章函数函数与运算符的重载ppt课件

上传人:无*** 文档编号:189259225 上传时间:2023-02-21 格式:PPT 页数:38 大小:108.50KB
收藏 版权申诉 举报 下载
第05章函数函数与运算符的重载ppt课件_第1页
第1页 / 共38页
第05章函数函数与运算符的重载ppt课件_第2页
第2页 / 共38页
第05章函数函数与运算符的重载ppt课件_第3页
第3页 / 共38页
资源描述:

《第05章函数函数与运算符的重载ppt课件》由会员分享,可在线阅读,更多相关《第05章函数函数与运算符的重载ppt课件(38页珍藏版)》请在装配图网上搜索。

1、第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数在函数在C+C+程序设计中的意义体现在四个方面:程序设计中的意义体现在四个方面:(1 1从历史上说,函数的思想来源于子程序,把程序从历史上说,函数的思想来源于子程序,把程序中反复出现的相同或相近的程序改写成子程序,可以大中反复出现的相同或相近的程序改写成子程序,可以大大缩短程序的长度。函数实际上是参数化的子程序。大缩短程序的长度。函数实际上是参数化的子程序。(2 2从结构化程序设计从结构化程序设计SPSP的观点来看,更重要的的观点来看,更重要的是通过函数设计,可以把整个程序要完成的整体的复是通过函数设计,可以把整个程序要完成的整

2、体的复杂的计算任务,分解为一个个较小的,相对简单的子杂的计算任务,分解为一个个较小的,相对简单的子任务。这种模块化的程序易设计,易阅读,易调试,任务。这种模块化的程序易设计,易阅读,易调试,易维护,较少出错。易维护,较少出错。(3 3从运算的角度说,函数就是从运算的角度说,函数就是C+C+语言提供的由用语言提供的由用户定义的运算。运算符是系统提供的运算,而函数是户定义的运算。运算符是系统提供的运算,而函数是由用户自己定义的运算。由用户自己定义的运算。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(4 4作为面向对象程序设计作为面向对象程序设计OOPOOP语言的语言的C+C+,以

3、,以类为核心,类由数据和方法组成,方法就是对数据的类为核心,类由数据和方法组成,方法就是对数据的运算和处理,亦即类的函数成员。故函数设计同样是运算和处理,亦即类的函数成员。故函数设计同样是OOP OOP 的重要组成部分。的重要组成部分。5.1 5.1 三次方程求根程序的设计三次方程求根程序的设计5.2 5.2 函数的说明与使用函数的说明与使用5.2.1 5.2.1 函数说明函数说明 C+程序允许两种函数说明语句的形式,程序允许两种函数说明语句的形式,我们把它们分别称为函数原型或函数声明我们把它们分别称为函数原型或函数声明和函数定义。和函数定义。第五章第五章 函数,函数与运算符的重载函数,函数与

4、运算符的重载1 1函数原型函数原型 函数原型用来指出函数的名称、类型和参数,函数原型用来指出函数的名称、类型和参数,其格式为:其格式为:();属性说明:可缺省,一般可以是下面的关键字之一:inline,static,virtual,friend 等。inline 表示该函数为内联函数;static 表示该函数为静态(内部)函数;virtual 表示该函数为虚函数;friend 表示该函数为某类(class)的友元函数。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数原型一般在两种情形下被使用:函数原型一般在两种情形下被使用:在程序中某函数的调用语句出现在该函数的定义之在程序中

5、某函数的调用语句出现在该函数的定义之前,这时必须在调用语句之前列出函数原型。前,这时必须在调用语句之前列出函数原型。为了类定义的简明清晰,一般把较大的函数成员定为了类定义的简明清晰,一般把较大的函数成员定义移到类说明之外,这时应把该函数的原型列于类说义移到类说明之外,这时应把该函数的原型列于类说明之中。明之中。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载2函数定义函数定义 函数定义与函数原型的主要区别是它还包括函数体,函数定义与函数原型的主要区别是它还包括函数体,其格式为:其格式为:属性说明类型函数名(参数表)属性说明类型函数名(参数表)函数体函数体 属性说明,返回类型,函数

6、名与函数原型一致,参属性说明,返回类型,函数名与函数原型一致,参数表中不可省略参数名。数表中不可省略参数名。函数体:由和括起来的复合语句即程序块。函数体:由和括起来的复合语句即程序块。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.2 5.2.2 函数调用函数调用 函数调用是已定义函数的一次实际运行函数调用是已定义函数的一次实际运行,与某与某类型的一个变量类型的一个变量,某类的一个对象类似某类的一个对象类似,函数调用函数调用也是函数定义的一个也是函数定义的一个“实例实例”。函数调用的两要素是函数名和实参表。具体的函数调用的两要素是函数名和实参表。具体的调用实施过程如下:调

7、用实施过程如下:(1)根据调用语句中的函数名在整个程序中搜索根据调用语句中的函数名在整个程序中搜索同名函数定义;同名函数定义;(2)对实参数的参数个数,类型,顺序进行核对,对实参数的参数个数,类型,顺序进行核对,判定是否与函数定义中的形参表对应一致,判定是否与函数定义中的形参表对应一致,第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(3)根据参数的类型值参数或引用参数进行值根据参数的类型值参数或引用参数进行值参数的值传递或引用参数的换名;参数的值传递或引用参数的换名;(4)运行函数体代码;运行函数体代码;(5)返回调用点,并返回所要求的函数值。返回调用点,并返回所要求的函数值。

8、5.2.3 5.2.3 函数的返回函数的返回函数的返回完成两项任务:函数的返回完成两项任务:把运行控制从函数体返回到函数调用点。把运行控制从函数体返回到函数调用点。根据返回值要求,返回所需要的数据值。根据返回值要求,返回所需要的数据值。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数的返回值有下面几种情形:函数的返回值有下面几种情形:1.1.返回返回void void 类型类型 如果函数无值返回,应说明为如果函数无值返回,应说明为void void 类型。类型。2 2返回数值类型返回数值类型 最常见的函数是返回一个数值的函数。最常见的函数是返回一个数值的函数。3 3返回引用类

9、型返回引用类型 值返回方式是值返回方式是C C 和和Pascal Pascal 语言中唯一的返回方式,语言中唯一的返回方式,C+C+语言提供的引用返回概念是其特有的一种很强的功语言提供的引用返回概念是其特有的一种很强的功能,当函数定义中把该函数说明为某类型的引用类型能,当函数定义中把该函数说明为某类型的引用类型时,该函数调用后返回的不单是值,而是包含返回值时,该函数调用后返回的不单是值,而是包含返回值的变量或对象)。的变量或对象)。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.4 5.2.4 函数的参数函数的参数 C+语言允许函数无参、有一个或多个参数,语言允许函数无参

10、、有一个或多个参数,而且还支持不定个数参数的函数。而且还支持不定个数参数的函数。无参函数:其函数说明为下列形式:无参函数:其函数说明为下列形式:void printvoid printvoidvoid););int getxint getx();();用用void void 或空表示无参。或空表示无参。(2)一个或多个参数:一个或多个参数:(3)不定个数参数:不定个数参数:有些应用问题中参数个数是变化的。处理参有些应用问题中参数个数是变化的。处理参数个数不定的情形,可有不同的途径。数个数不定的情形,可有不同的途径。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载v 如:如:voi

11、d sortvoid sortint nint n,float float*a a););这个函数可对这个函数可对n n 长的浮点数组进行排序,长的浮点数组进行排序,n n 是是变化的;由于变化的;由于a a 是数组的首地址,因此这个函数实是数组的首地址,因此这个函数实际上是可以进行对任意多个浮点数排序的处理。际上是可以进行对任意多个浮点数排序的处理。v C+C+语言有的版本还提供一些库函数,支持处理形语言有的版本还提供一些库函数,支持处理形如:如:void abcvoid abcint i,int i,);的不定参数函数。);的不定参数函数。v C+C+语言语言,允许参数表中包含无名参数,主

12、要是为了允许参数表中包含无名参数,主要是为了区分函数,例如:区分函数,例如:int fint fint aint a,int bint b)return areturn ab b*b b;int fint fint aint a,int bint b,intint)return areturn a*a ab b;两个不同的函数同名,但由于第二个函数包含一无两个不同的函数同名,但由于第二个函数包含一无名参数,使得在调用时能够被区分,名参数,使得在调用时能够被区分,f fx x,y y是第是第一个函数的调用,一个函数的调用,f fx x,y y,0 0是第二个函数的调是第二个函数的调用。用。第五章

13、第五章 函数,函数与运算符的重载函数,函数与运算符的重载v C+C+程序还允许为函数定义可缺省参数程序还允许为函数定义可缺省参数(即参数有默即参数有默认值。当对应的实参缺省时,该形参将使用默认认值。当对应的实参缺省时,该形参将使用默认值。值。),这种函数调用时具有灵活性,例如:,这种函数调用时具有灵活性,例如:int sqrsumint sqrsumint aint a,int bint b,int cint c0 0)return areturn a*a ab b*b bc c*c c;其中参数其中参数c c 为可缺省参数,下面的调用方式都是合为可缺省参数,下面的调用方式都是合法的法的x x

14、,y y,z z 为为int int 型变量):型变量):sqrsumsqrsumx x,y y,z z)sqrsumsqrsumx xy y,x xy y)sqrsumsqrsumx x,y y)参数表中可有任意多个参数指定为可缺省参数,但参数表中可有任意多个参数指定为可缺省参数,但所有可缺省参数必须列后。在调用该函数时,只能所有可缺省参数必须列后。在调用该函数时,只能缺省后面的可缺省参数。缺省后面的可缺省参数。可缺省参数例:可缺省参数例:p5_3.cpp第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.5 5.2.5 值调用与引用调用值调用与引用调用 C+语言在进行函数

15、调用时,对参数的处理语言在进行函数调用时,对参数的处理有两种方式,即值调用方式和引用调用方式。前有两种方式,即值调用方式和引用调用方式。前者是普通的形式,在者是普通的形式,在C 语言中只有这种方式;语言中只有这种方式;C+语言中增加了引用调用形式,这种形式与语言中增加了引用调用形式,这种形式与pascal 语言中的变量参数调用方式相似。语言中的变量参数调用方式相似。1 赋值调用方式值调用方式)赋值调用方式值调用方式)在函数定义的参数中,除了被说明为引用(在函数定义的参数中,除了被说明为引用(&)的)的参数之外,其余所有类型的形参都属于赋值形参。参数之外,其余所有类型的形参都属于赋值形参。凡是赋

16、值形参,在函数的每次调用时,都必须为凡是赋值形参,在函数的每次调用时,都必须为每一个赋值形参创建一个新的参数变量。每一个赋值形参创建一个新的参数变量。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数调用语句中,与赋值形参相对应的实参可以是指函数调用语句中,与赋值形参相对应的实参可以是指定类型的常量、变量或表达式。定类型的常量、变量或表达式。为赋值形参创建的参数变量是局限于函数体运行的局为赋值形参创建的参数变量是局限于函数体运行的局部变量,它作为该形参的一个实例,参加函数体程序块部变量,它作为该形参的一个实例,参加函数体程序块的这次运行,一旦运行完毕,的这次运行,一旦运行完毕,

17、这个参数变量就被撤消。这个参数变量就被撤消。实参与形参即使同名,也没有直接的关系。调用该函实参与形参即使同名,也没有直接的关系。调用该函数,仅仅传递实参的值,实参本身与函数调用过程无关,数,仅仅传递实参的值,实参本身与函数调用过程无关,在调用之后其值不会改变。在调用之后其值不会改变。当一个函数有多个赋值形参时,在进行值传递过程中,当一个函数有多个赋值形参时,在进行值传递过程中,多个实参表达式计算的次序将依赖于具体的编译系统。多个实参表达式计算的次序将依赖于具体的编译系统。例如:例如:realpararealparan+n+,n-n-););第五章第五章 函数,函数与运算符的重载函数,函数与运算

18、符的重载2引用调用方式引用调用方式引用形参:函数定义的参数表中,名字前加上符引用形参:函数定义的参数表中,名字前加上符号的参数为引用形参。号的参数为引用形参。例如:例如:void swapvoid swapintinta a,intintb b)int tempint tempa a;a ab b;b btemptemp;形参形参a a,b b 为引用形参,这时其函数原型可写为:为引用形参,这时其函数原型可写为:void swapvoid swapintint,intint););第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载引用形参在调用过程中的参数传递机制不同于赋值引用形参

19、在调用过程中的参数传递机制不同于赋值形参。其要点是:形参。其要点是:(1函数的调用语句中对应于引用形参的实参必须是同一类型的变量,非变量的表达式则不允许。(2参数传递的内容不是实参的值,而是地址,其实际的效果是令对应的引用形参在调用过程中,作为一个变量名指向作为实参的这个变量,与赋值形参的不同在这里体现出来,在引用调用过程中并不创建新的参数变量!(3在函数体程序块的运行中,引用形参的每次出现,由于它现在已经是指向实参变量,因此相当于全用实参变量所代替。即起到了所谓的“换名的作用。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(4在函数体程序运行结束,控制转回调用点时,该引用形参

20、与实参变量的对应关系也就终止了。但是在调用过程中对于这个实参变量的所有处理和操作的结果,却保留下来。这一点也是区别于赋值调用的。它不需要借助于指针类型,直接可以把函数处理结果带出函数。C+C+语言提供的引用调用方式,表面上看它与利用语言提供的引用调用方式,表面上看它与利用指针类型的形参的赋值调用所起的效果相同,实际指针类型的形参的赋值调用所起的效果相同,实际上它优于指针方法。上它优于指针方法。使用指针方法示例使用指针方法示例:void swapvoid swapint int*a a,int int*b b)int tempint temp*a a;*a a*b b;*b btemptemp;

21、第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载设计函数在下面两种情形时,建议采用引用参数。设计函数在下面两种情形时,建议采用引用参数。需要改变某些变量的值上述函数swap 就是一例);对于占内存较多的参数如数组,对象参数为了不另建新的参数变量以节省内存。在后一种情况,为了保证实参不在函数中被修改,在后一种情况,为了保证实参不在函数中被修改,可在形参说明中加上可在形参说明中加上const const 说明说明(在函数体中不在函数体中不能改变其值)。而对于赋值形参,则无此必要。能改变其值)。而对于赋值形参,则无此必要。例如:例如:complex addcomplex addcons

22、t complexconst complexa a,const complexconst complexb b););值调用与引用调用例:值调用与引用调用例:p5_2.cpp第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.6 5.2.6 内联函数内联函数内联内联inlineinline函数的设置是函数的设置是C+C+不同于不同于C C 的特征之一。的特征之一。(1 1在在C+C+程序中符合下列条件之一的函数为内联函数:程序中符合下列条件之一的函数为内联函数:函数说明前冠以函数说明前冠以“inlineinline关键字的函数;关键字的函数;类内定义的函数成员。类内定义的函数

23、成员。(第第7 7章介绍章介绍)(2 2在编译过程中,凡内联函数,系统把它的执行代码在编译过程中,凡内联函数,系统把它的执行代码插入到该函数的每个调用点,从而使程序执行过程中,每插入到该函数的每个调用点,从而使程序执行过程中,每次调用该函数时不需控制转移,但该函数代码可能有多个次调用该函数时不需控制转移,但该函数代码可能有多个拷贝出现在目标程序中。拷贝出现在目标程序中。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(3 3一般把函数体短小而又频繁调用的函数说明一般把函数体短小而又频繁调用的函数说明为内联函数较好。为内联函数较好。内联函数体内一般不能有循环语句和内联函数体内一般不

24、能有循环语句和switchswitch语句。语句。内联函数的定义必须出现在第一次调用之前。内联函数的定义必须出现在第一次调用之前。对内联函数不能进行异常接口声明。对内联函数不能进行异常接口声明。(4 4利用编译预处理的宏定义方式,也可以实现利用编译预处理的宏定义方式,也可以实现类似于内联函数的功能。不过,宏定义方式没有类类似于内联函数的功能。不过,宏定义方式没有类型的概念,是不安全的;内联函数的方式更为方便型的概念,是不安全的;内联函数的方式更为方便和可靠。和可靠。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.3 5.3 函数的嵌套与递归函数的嵌套与递归5.3.1 函数嵌套

25、函数嵌套一个函数的函数体中包含一个或多个函数调用语一个函数的函数体中包含一个或多个函数调用语句,即称为函数嵌套。句,即称为函数嵌套。函数嵌套调用所占用的空间如赋值参数的创建函数嵌套调用所占用的空间如赋值参数的创建等等用堆栈等等用堆栈stackstack的方式管理。一般这种堆的方式管理。一般这种堆栈所分配的空间是有限的,因此函数互相嵌套的栈所分配的空间是有限的,因此函数互相嵌套的层数也是有限的,依编译系统不同,其允许的嵌层数也是有限的,依编译系统不同,其允许的嵌套层数也可能不同。套层数也可能不同。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载嵌套调用和返回示图:Main()函数调

26、用f1函数完毕f1函数调用f2函数完毕f2函数完毕第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.3.2 函数的递归函数的递归函数函数A A 在其函数体中直接包含它自己的调用语句,在其函数体中直接包含它自己的调用语句,函数函数A A 称为直接递归函数。称为直接递归函数。函数函数A A 在其函数体中间接地包含对它自己的调用,在其函数体中间接地包含对它自己的调用,例如例如A A 调用函数调用函数B,B,但函数但函数B B 又调用函数又调用函数A A,则函数,则函数A A 称为间接递归函数。称为间接递归函数。无论是直接递归还是间接递归都必须保证在有限无论是直接递归还是间接递归都必须

27、保证在有限次调用之后能够结束。次调用之后能够结束。函数调用时系统要付出时间和空间代价,在功能函数调用时系统要付出时间和空间代价,在功能相同的情形下,总是非递归程序效率较高。相同的情形下,总是非递归程序效率较高。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载/*利用递归调用求n!的函数*/float fac(int n)float f;if(n=1)f=1;else f=fac(n-1)*n;return f;计算计算4!(fac(4))的递归过程图:)的递归过程图:fac(4)(4n)f=fac(n-1)*n即:fac(3)*4fac(3)(3 n)f=fac(n-1)*n即:

28、fac(2)*3fac(2)(2 n)f=fac(n-1)*n即:fac(1)*2fac(1)(1 n)f=1return f(使fac(1)=1)return f(使fac(2)=2)return f(使fac(3)=6)return f(使fac(4)=24)第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.4 5.4 函数与运算符的重载函数与运算符的重载函数重载实际上是函数名重载,即支持多个不同函数重载实际上是函数名重载,即支持多个不同的函数采用同一名字。(这一点在的函数采用同一名字。(这一点在C C 语言和其它语语言和其它语言中是不允许的。)言中是不允许的。)函数的重载

29、并不是为了节省标识符,而是为了方函数的重载并不是为了节省标识符,而是为了方便程序员的使用。便程序员的使用。5.4.1 5.4.1 函数重载函数重载实现函数的重载必须满足下列条件之一;实现函数的重载必须满足下列条件之一;(1 1参数表中对应的参数类型不同;参数表中对应的参数类型不同;(2 2参数表中参数个数不同:参数表中参数个数不同:(3 3参数表中不同类型参数的次序不同。参数表中不同类型参数的次序不同。重载函数例程:重载函数例程:p5_0.cpp第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载在定义同名函数时应注意:在定义同名函数时应注意:(1 1返回类型不能区分函数。返回类型不

30、能区分函数。例如:例如:float addfloat addintint,floatfloat););int addint addintint,floatfloat););/错错误误(2 2采用引用参数不能区分函数。采用引用参数不能区分函数。例如:例如:void printvoid printdoubledouble););void printvoid printdoubledouble);/);/错错误误 void printvoid printconst doubleconst double););/错误错误(3 3有些派生基本类型的参数虽然可以区分同名有些派生基本类型的参数虽然可以区分同

31、名函数,但在使用中必须注意可能出现二义性。函数,但在使用中必须注意可能出现二义性。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(4 4包含可缺省参数时,可能造成二义性,程序设包含可缺省参数时,可能造成二义性,程序设计中应避免这种情形出现。计中应避免这种情形出现。例如:例如:int sumint sumint aint a,int bint b,int cint c0 0););int sumint sumint aint a,int bint b););(5 5参数名不能区分函数。参数名不能区分函数。例如:例如:int sumint sumint aint a,int bin

32、t b););int sumint sumint xint x,int yint y););(6 6不要将不同功能的函数定义为重载函数,以免不要将不同功能的函数定义为重载函数,以免出现对调用结果的误解,但语法上是允许的。出现对调用结果的误解,但语法上是允许的。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载遇到无准确匹配的函数定义时,遇到无准确匹配的函数定义时,C+C+系统并不马上按出系统并不马上按出错处理,它按下面的方式处理:错处理,它按下面的方式处理:(1 1通过数组名与指针变量,函数名与函数指针,某通过数组名与指针变量,函数名与函数指针,某类型变量与类型变量与const c

33、onst 常量之间的转换,再查是否可实现匹常量之间的转换,再查是否可实现匹配;配;(2 2把实参类型从低到高按字长由短到长进行基把实参类型从低到高按字长由短到长进行基本类型及其派生类型的转换,再检查是否可匹配;本类型及其派生类型的转换,再检查是否可匹配;(3 3查有无已定义的可变个数参数的函数,如有把它查有无已定义的可变个数参数的函数,如有把它归为该函数。归为该函数。在进行上述尝试性的处理之后可能出现仍无匹配或匹在进行上述尝试性的处理之后可能出现仍无匹配或匹配不唯一的情况,这时可能输出出错信息或错误地运行。配不唯一的情况,这时可能输出出错信息或错误地运行。第五章第五章 函数,函数与运算符的重载

34、函数,函数与运算符的重载5.4.2 5.4.2 运算符重载运算符重载C+语言规定,大多数运算符都可以重载,包括:语言规定,大多数运算符都可以重载,包括:单目运算符:单目运算符:-,!,!,+,-,newnew,deletedelete双目运算符:双目运算符:+,-,*,(算术运算)(算术运算),(位运算)(位运算)&,|(逻辑运算)(逻辑运算)=,!=!=,=,=(关系运算)(关系运算),*,(赋值运算)(赋值运算),(赋值运算)(赋值运算),(逗号运算)(逗号运算),(I IO O 运算)运算)(),(),(其它)(其它)第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载不可重载

35、运算符包括:不可重载运算符包括:限定符限定符 .:条件运算符条件运算符?:?:取长度运算符取长度运算符 sizeofsizeof算术运算符,逻辑运算符,位运算符和关系运算符算术运算符,逻辑运算符,位运算符和关系运算符中的,这些运算都与基本数据类中的,这些运算都与基本数据类型有关,通过运算重载函数的定义,使它们也用于某型有关,通过运算重载函数的定义,使它们也用于某些用户定义的数据类型。些用户定义的数据类型。赋值运算符,关系运算符,!,指针运算赋值运算符,关系运算符,!,指针运算符和符和*,下标运算符等,它们的运算所涉及的,下标运算符等,它们的运算所涉及的数据类型按数据类型按C+C+程序规定,并非

36、只限于基本数值类型。程序规定,并非只限于基本数值类型。因而,这些运算符可以自动地扩展到任何用户定义因而,这些运算符可以自动地扩展到任何用户定义的数据类型,一般不需作重载定义就可的数据类型,一般不需作重载定义就可“自动地自动地实现重载。实现重载。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载重载之后,运算符的优先级和结合性不会改变。重载之后,运算符的优先级和结合性不会改变。一般来讲,重载的功能应与原有功能相类似,不能一般来讲,重载的功能应与原有功能相类似,不能改变原运算符的操作数个数,同时至少要有一个操作改变原运算符的操作数个数,同时至少要有一个操作对象是用户自定义类型。对象是用

37、户自定义类型。运算符重载的一般语法形式为:运算符重载的一般语法形式为:函数类型函数类型 operator 运算符运算符(形参表形参表)运算符重载函数的调用方式有两种:运算符重载函数的调用方式有两种:(1与原运算符相同的调用方式。如与原运算符相同的调用方式。如b1+b2,b1*b2(2一般函数调用方式。如一般函数调用方式。如b1+b2,也可以写为,也可以写为operator+(b1,b2)例:复数加减:例:复数加减:p5_1.cpp第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载在在C+中运算符的重载一般针对类,重载有两种形中运算符的重载一般针对类,重载有两种形式:重载为类的成员函

38、数和重载为类外函数。式:重载为类的成员函数和重载为类外函数。当重载为类的成员函数时,函数的参数个数比原来当重载为类的成员函数时,函数的参数个数比原来的操作数个数要少一个后缀的操作数个数要少一个后缀+、-除外);当重载除外);当重载为类外函数时,函数的参数个数与原来的操作数个为类外函数时,函数的参数个数与原来的操作数个数相等。数相等。单目运算符单目运算符+和和-实际上各有两种用法,前缀增实际上各有两种用法,前缀增减量和后缀增减量。其运算符重载函数的减量和后缀增减量。其运算符重载函数的定义当然是不同的,对两种不同的运算无法从重载定义当然是不同的,对两种不同的运算无法从重载函数的原型上予以区分:函数

39、名函数的原型上予以区分:函数名operator+)和)和参数表完全一样。为了区别前缀参数表完全一样。为了区别前缀+和后缀和后缀+,C+语言规定,在后缀语言规定,在后缀+的重载函数的原型参数表中增的重载函数的原型参数表中增加一个加一个int 型的无名参数。其原型形式为:型的无名参数。其原型形式为:第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载前缀前缀+类型类型operator+operator+()/作为类成员作为类成员 类型类型operator+operator+(类型)(类型)/作为类外函数作为类外函数后缀后缀+类型类型operator+operator+(intint)/作

40、为类成员作为类成员 类型类型operator+operator+(类型,(类型,intint)/作为类外函作为类外函数数关于减量运算符的重载方式相同。其调用方法为:关于减量运算符的重载方式相同。其调用方法为:前缀前缀+a+a 或或a.operator+a.operator+()()operator+operator+(a a)后缀后缀+a+a+或或a.operator+a.operator+(0 0)operator+operator+(a a,0 0)第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.5 5.5 函数与函数与C+C+程序结构程序结构5.5.1 5.5.1 库函

41、数的使用库函数的使用 库函数又叫标准函数,程序员可直接调用,但库函数又叫标准函数,程序员可直接调用,但要在程序开头说明库函数所在的头文件。如:要在程序开头说明库函数所在的头文件。如:#include#include#include#include 5.5.2 SP5.5.2 SP框架结构框架结构5.5.3 5.5.3 函数间的数据传递函数间的数据传递通过赋值参数和返回语句通过赋值参数和返回语句通过全局变量通过全局变量通过指针类型参数和引用型参数通过指针类型参数和引用型参数通过数组类型参数本质上与指针类型参数相同)通过数组类型参数本质上与指针类型参数相同)第五章第五章 函数,函数与运算符的重载函

42、数,函数与运算符的重载5.5.4 5.5.4 变量与函数的作用域变量与函数的作用域1.1.外部存储属性与静态存储属性外部存储属性与静态存储属性整个程序外部函数、类、非静态全局变量)整个程序外部函数、类、非静态全局变量)程序文件静态函数、静态全局变量)程序文件静态函数、静态全局变量)函数局部变量、静态局部变量、形参)函数局部变量、静态局部变量、形参)程序块复合语句)(块内定义的局部变量)程序块复合语句)(块内定义的局部变量)C+程序中标识符的作用域有下面几个等级:程序中标识符的作用域有下面几个等级:2.2.名字标识符的生存期与作用域名字标识符的生存期与作用域外部存储属性:在所有的函数、类、名字空

43、间外说外部存储属性:在所有的函数、类、名字空间外说明的标识符。明的标识符。静态存储属性:加以限定后使标识符的作用域限定静态存储属性:加以限定后使标识符的作用域限定于其所在文件中有效。如:静态全局变量、静态局于其所在文件中有效。如:静态全局变量、静态局部变量、静态函数。部变量、静态函数。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.6 5.6 程序实例程序实例1.“1.“三色冰激凌程序三色冰激凌程序 由冰激凌商提出的问题:有由冰激凌商提出的问题:有2828种颜色的原料,种颜色的原料,可以组合成多少种可以组合成多少种3 3色冰激凌。问题归结为计算排色冰激凌。问题归结为计算排列数

44、与组合数。列数与组合数。2.Hanoi2.Hanoi塔问题塔问题 古印度的著名智力测验问题:有三个立柱古印度的著名智力测验问题:有三个立柱A A、B B、C C,在,在A A柱上穿有大小不等的圆盘柱上穿有大小不等的圆盘6464个,个,较大的圆盘在下,较小者在上。要求借助于较大的圆盘在下,较小者在上。要求借助于B B柱将柱将A A柱上的柱上的6464个圆盘移到个圆盘移到C C柱,规则为:柱,规则为:程序:程序:p5_4.cpp第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(1)(1)每次只能把一个柱上最上面的圆盘移至另一个柱每次只能把一个柱上最上面的圆盘移至另一个柱的最上面的最上

45、面;(2)(2)每个柱上总保持较大的圆盘在下,较小者在上。每个柱上总保持较大的圆盘在下,较小者在上。编制程序编制程序,实现将任意实现将任意n n个圆盘从个圆盘从A A柱借助于柱借助于B B柱柱移到移到C C柱柱,并显示出全部移动过程。并显示出全部移动过程。总任务总任务(“(“度为度为n n的任务的任务):把:把A A柱上的柱上的n n个圆盘,个圆盘,借助于借助于B B柱,按规则移到柱,按规则移到C C柱上柱上(移动规则:一次移动规则:一次移一片,大片不可压小片移一片,大片不可压小片)。靠调用自定义函数靠调用自定义函数hanoihanoi来完成:来完成:hanoi(n,A,B,C);hanoi(

46、n,A,B,C);第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载总任务可分解为与其等价的三个子任务总任务可分解为与其等价的三个子任务(的的“合合集集”)(“)(“度小于等于度小于等于n-1n-1的三个子任务的三个子任务):(1)(1)把把A A柱上最上面柱上最上面n-1n-1个圆盘,借助于个圆盘,借助于C C柱,按柱,按规则移到规则移到B B柱上柱上(一次递归调用一次递归调用);(2)(2)把把A A柱上留下的柱上留下的(最大的最大的)圆盘移到圆盘移到C C柱上柱上(一一步可完成的步可完成的“本原任务本原任务”);(3)(3)把把B B柱上的柱上的n-1n-1个圆盘,借助于个圆盘,借助于A A柱,按规则柱,按规则移到移到C C柱上柱上(又一次递归调用又一次递归调用)。第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载靠下面的三个调用语句来完成:靠下面的三个调用语句来完成:hanoi(n-1,A,C,B);hanoi(n-1,A,C,B);move(A,C);move(A,C);hanoi(n-1,B,A,C);hanoi(n-1,B,A,C);程序:程序:p5_5.cpp

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!