函数函数与运算符的重载省公共课一等奖全国赛课获奖课件.pptx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 运算 重载 公共课 一等奖 全国 获奖 课件
- 资源描述:
-
第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数在函数在C+程序设计中意义表达在四个方面:程序设计中意义表达在四个方面:(1)从历史上说,函数思想起源于子程序,把程序中)从历史上说,函数思想起源于子程序,把程序中重复出现相同或相近程序改写成子程序,能够大大缩短重复出现相同或相近程序改写成子程序,能够大大缩短程序长度。函数实际上是参数化子程序。程序长度。函数实际上是参数化子程序。(2 2)从结构化程序设计()从结构化程序设计(SPSP)观点来看,更主要是经)观点来看,更主要是经过函数设计,能够把整个程序要完成整体复杂计算任过函数设计,能够把整个程序要完成整体复杂计算任务,分解为一个个较小,相对简单子任务。这种模块务,分解为一个个较小,相对简单子任务。这种模块化程序易设计,易阅读,易调试,易维护,较少犯错。化程序易设计,易阅读,易调试,易维护,较少犯错。(3 3)从运算角度说,函数就是)从运算角度说,函数就是C+C+语言提供由用户定语言提供由用户定义运算。运算符是系统提供运算,而函数是由用户自义运算。运算符是系统提供运算,而函数是由用户自己定义运算。己定义运算。1第1页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(4 4)作为面向对象程序设计()作为面向对象程序设计(OOPOOP)语言)语言C+C+,以类,以类为关键,类由数据和方法组成,方法就是对数据运算为关键,类由数据和方法组成,方法就是对数据运算和处理,亦即类函数组员。故函数设计一样是和处理,亦即类函数组员。故函数设计一样是OOP OOP 主主要组成部分。要组成部分。5.1 5.1 三次方程求根程序设计三次方程求根程序设计5.2 5.2 函数说明与使用函数说明与使用5.2.1 5.2.1 函数说明函数说明 C+程序允许两种函数说明语句形式,我程序允许两种函数说明语句形式,我们把它们分别称为函数原型(或函数申明)和们把它们分别称为函数原型(或函数申明)和函数定义。函数定义。2第2页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载1 1函数原型函数原型 函数原型用来指出函数名称、类型和参数,其函数原型用来指出函数名称、类型和参数,其格式为:格式为:();属性说明:可缺省,普通能够是下面关键字之一:inline,static,virtual,friend 等。inline 表示该函数为内联函数;static 表示该函数为静态(内部)函数;virtual 表示该函数为虚函数;friend 表示该函数为某类(class)友元函数。3第3页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数原型普通在两种情形下被使用:函数原型普通在两种情形下被使用:在程序中某函数调用语句出现在该函数定义之前,在程序中某函数调用语句出现在该函数定义之前,这时必须在调用语句之前列出函数原型。这时必须在调用语句之前列出函数原型。为了类定义简明清楚,普通把较大函数组员定义移为了类定义简明清楚,普通把较大函数组员定义移到类说明之外,这时应把该函数原型列于类说明之中。到类说明之外,这时应把该函数原型列于类说明之中。4第4页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载2函数定义函数定义 函数定义与函数原型主要区分是它还包含函数体,函数定义与函数原型主要区分是它还包含函数体,其格式为:其格式为:属性说明类型函数名(参数表)属性说明类型函数名(参数表)函数体函数体 属性说明,返回类型,函数名与函数原型一致,属性说明,返回类型,函数名与函数原型一致,参数表中不可省略参数名。参数表中不可省略参数名。函数体函数体:由和括起来复合语句即程序块。由和括起来复合语句即程序块。5第5页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.2 5.2.2 函数调用函数调用 函数调用是已定义函数一次实际运行函数调用是已定义函数一次实际运行,与某类与某类型一个变量型一个变量,某类一个对象类似某类一个对象类似,函数调用也是函函数调用也是函数定义一个数定义一个“实例实例”。函数调用两要素是函数名和实参表。详细调用函数调用两要素是函数名和实参表。详细调用实施过程以下:实施过程以下:(1)依据调用语句中函数名在整个程序中搜索同依据调用语句中函数名在整个程序中搜索同名函数定义;名函数定义;(2)对实参数参数个数,类型,次序进行查对,对实参数参数个数,类型,次序进行查对,判定是否与函数定义中形参表对应一致,判定是否与函数定义中形参表对应一致,6第6页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(3)依据参数类型(值参数或引用参数)进行值参依据参数类型(值参数或引用参数)进行值参数值传递或引用参数换名;数值传递或引用参数换名;(4)运行函数体代码;运行函数体代码;(5)返回调用点,并返回所要求函数值。返回调用点,并返回所要求函数值。5.2.3 5.2.3 函数返回函数返回函数返回完成两项任务:函数返回完成两项任务:(1)(1)把运行控制从函数体返回到函数调用点。把运行控制从函数体返回到函数调用点。(2)(2)依据返回值要求,返回所需要数据值。依据返回值要求,返回所需要数据值。7第7页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数返回值有下面几个情形:函数返回值有下面几个情形:1.返回返回void 类型类型 假如函数无值返回,应说明为假如函数无值返回,应说明为void 类型。类型。2返回数值类型返回数值类型 最常见函数是返回一个数值函数。最常见函数是返回一个数值函数。3返回引用类型返回引用类型 值返回方式是值返回方式是C 和和Pascal 语言中唯一返回方式,语言中唯一返回方式,C+语言提供引用返回概念是其特有一个很强功效,语言提供引用返回概念是其特有一个很强功效,当函数定义中把该函数说明为某类型引用类型时,该当函数定义中把该函数说明为某类型引用类型时,该函数调用后返回不单是值,而是包含返回值变量(或函数调用后返回不单是值,而是包含返回值变量(或对象)。对象)。8第8页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.4 5.2.4 函数参数函数参数 C+语言允许函数无参、有一个或多个参数,语言允许函数无参、有一个或多个参数,而且还支持不定个数参数函数。而且还支持不定个数参数函数。(1)(1)无参函数:其函数说明为以下形式:无参函数:其函数说明为以下形式:void print(void););int getx();();用用void 或空表示无参。或空表示无参。(2)一个或多个参数:一个或多个参数:(3)不定个数参数:不定个数参数:有些应用问题中参数个数是改变。处理参数有些应用问题中参数个数是改变。处理参数个数不定情形,可有不一样路径。个数不定情形,可有不一样路径。9第9页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载v如:如:void sort(int n,float*a););这个函数可对这个函数可对n 长浮点数组进行排序,长浮点数组进行排序,n 是改是改变;因为变;因为a 是数组首地址,所以这个函数实际上是是数组首地址,所以这个函数实际上是能够进行对任意多个浮点数排序处理。能够进行对任意多个浮点数排序处理。vC+C+语言有版本还提供一些库函数,支持处理形如:语言有版本还提供一些库函数,支持处理形如:void abcvoid abc(int i,int i,);不定参数函数。);不定参数函数。vC+C+语言语言,允许参数表中包含无名参数,主要是为了允许参数表中包含无名参数,主要是为了区分函数,比如:区分函数,比如:int fint f(int aint a,int bint b)return areturn ab*bb*b;int fint f(int aint a,int bint b,intint)return a*areturn a*ab b;两个不一样函数同名,但因为第二个函数包含一无两个不一样函数同名,但因为第二个函数包含一无名参数,使得在调用时能够被区分,名参数,使得在调用时能够被区分,f f(x x,y y)是第)是第一个函数调用,一个函数调用,f f(x x,y y,0 0)是第二个函数调用。)是第二个函数调用。10第10页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载vC+C+程序还允许为函数定义可缺省参数程序还允许为函数定义可缺省参数(即参数有默即参数有默认值。当对应实参缺省时,该形参将使用默认值。认值。当对应实参缺省时,该形参将使用默认值。),这种函数调用时含有灵活性,比如:,这种函数调用时含有灵活性,比如:int sqrsum int sqrsum(int aint a,int bint b,int cint c0 0)return a*a return a*ab*bb*bc*cc*c;其中参数其中参数c c 为可缺省参数,下面调用方式都是正当为可缺省参数,下面调用方式都是正当(x x,y y,z z 为为int int 型变量):型变量):sqrsum sqrsum(x x,y y,z z)sqrsum sqrsum(x xy y,x xy y)sqrsum sqrsum(x x,y y)参数表中可有任意多个参数指定为可缺省参数,但参数表中可有任意多个参数指定为可缺省参数,但全部可缺省参数必须列后。全部可缺省参数必须列后。在调用该函数时,只能在调用该函数时,只能缺省后面可缺省参数。缺省后面可缺省参数。可缺省参数例:可缺省参数例:p5_3.cpp11第11页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.5 5.2.5 值调用与引用调用值调用与引用调用 C+语言在进行函数调用时,对参数处理有两语言在进行函数调用时,对参数处理有两种方式,即值调用方式和引用调用方式。前者是种方式,即值调用方式和引用调用方式。前者是普通形式,在普通形式,在C 语言中只有这种方式;语言中只有这种方式;C+语言中语言中增加了引用调用形式,这种形式与增加了引用调用形式,这种形式与pascal 语言中语言中变量参数调用方式相同。变量参数调用方式相同。1 赋值调用方式(值调用方式)赋值调用方式(值调用方式)在函数定义参数中,除了被说明为引用(在函数定义参数中,除了被说明为引用(&)参数)参数之外,其余全部类型形参都属于赋值形参。之外,其余全部类型形参都属于赋值形参。凡是赋值形参,在函数每次调用时,都必须为每凡是赋值形参,在函数每次调用时,都必须为每一个赋值形参创建一个新参数变量。一个赋值形参创建一个新参数变量。12第12页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载函数调用语句中,与赋值形参相对应实参能够是指定函数调用语句中,与赋值形参相对应实参能够是指定类型常量、变量或表示式。类型常量、变量或表示式。为赋值形参创建参数变量是局限于函数体运行局部变为赋值形参创建参数变量是局限于函数体运行局部变量,它作为该形参一个实例,参加函数体程序块这次运量,它作为该形参一个实例,参加函数体程序块这次运行,一旦运行完成,行,一旦运行完成,这个参数变量就被撤消。这个参数变量就被撤消。实参加形参即使同名,也没有直接关系。调用该函数,实参加形参即使同名,也没有直接关系。调用该函数,仅仅传递实参值,实参本身与函数调用过程无关,在调仅仅传递实参值,实参本身与函数调用过程无关,在调用之后其值不会改变。用之后其值不会改变。当一个函数有多个赋值形参时,在进行值传递过程中,当一个函数有多个赋值形参时,在进行值传递过程中,多个实参表示式计算次序将依赖于详细编译系统。多个实参表示式计算次序将依赖于详细编译系统。比如:比如:realpara(n+,n-););13第13页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载2引用调用方式引用调用方式引用形参:函数定义参数表中,名字前加上符号引用形参:函数定义参数表中,名字前加上符号参数为引用形参。参数为引用形参。比如:比如:void swapvoid swap(intinta a,intintb b)int tempint tempa a;a ab b;b btemptemp;形参形参a,b 为引用形参,这时其函数原型可写为:为引用形参,这时其函数原型可写为:void swap(int,int););14第14页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载引用形参在调用过程中参数传递机制不一样于赋值引用形参在调用过程中参数传递机制不一样于赋值形参。其关键点是:形参。其关键点是:(1)函数调用语句中对应于引用形参实参必须是同一类型变量,非变量表示式则不允许。(2)参数传递内容不是实参值,而是地址,其实际效果是令对应引用形参在调用过程中,作为一个变量名指向作为实参这个变量,与赋值形参不一样在这里表示出来,在引用调用过程中并不创建新参数变量!(3)在函数体程序块运行中,引用形参每次出现,因为它现在已经是指向实参变量,所以相当于全用实参变量所代替。即起到了所谓“换名”作用。15第15页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(4)在函数体程序运行结束,控制转回调用点时,该引用形参加实参变量对应关系也就终止了。不过在调用过程中对于这个实参变量全部处理和操作结果,却保留下来。这一点也是区分于赋值调用。它不需要借助于指针类型,直接能够把函数处理结果带出函数。C+C+语言提供引用调用方式,表面上看它与利用指语言提供引用调用方式,表面上看它与利用指针类型形参赋值调用所起效果相同,实际上它优于针类型形参赋值调用所起效果相同,实际上它优于指针方法。指针方法。使用指针方法示例使用指针方法示例:void swapvoid swap(int*aint*a,int*bint*b)int tempint temp*a*a;*a*a*b*b;*b*btemptemp;16第16页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载设计函数在下面两种情形时,提议采取引用参数。设计函数在下面两种情形时,提议采取引用参数。1)需要改变一些变量值(上述函数swap 就是一例);2)对于占内存较多参数(如数组,对象参数)为了不另建新参数变量以节约内存。在后一个情况,为了确保实参不在函数中被修改,在后一个情况,为了确保实参不在函数中被修改,可在形参说明中加上可在形参说明中加上const 说明说明(在函数体中不能在函数体中不能改变其值)。而对于赋值形参,则无此必要。改变其值)。而对于赋值形参,则无此必要。比如:比如:complex add(const complexa,const complexb););值调用与引用调用例:值调用与引用调用例:p5_2.cpp17第17页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.2.6 5.2.6 内联函数内联函数内联(内联(inlineinline)函数)函数设置是设置是C+不一样于不一样于C 特征之一。特征之一。(1)在)在C+程序中符合以下条件之一函数为内联函数:程序中符合以下条件之一函数为内联函数:函数说明前冠以函数说明前冠以“inline”关键字函数;关键字函数;类内定义函数组员。类内定义函数组员。(第第7 7章介绍章介绍)(2)在编译过程中,凡内联函数,系统把它执行代码插)在编译过程中,凡内联函数,系统把它执行代码插入到该函数每个调用点,从而使程序执行过程中,每次调入到该函数每个调用点,从而使程序执行过程中,每次调用该函数时不需控制转移,但该函数代码可能有多个拷贝用该函数时不需控制转移,但该函数代码可能有多个拷贝出现在目标程序中。出现在目标程序中。18第18页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(3)普通把函数体短小而又频繁调用函数说明为)普通把函数体短小而又频繁调用函数说明为内联函数很好。内联函数很好。内联函数体内普通不能有循环语句和内联函数体内普通不能有循环语句和switchswitch语句。语句。内联函数定义必须出现在第一次调用之前。内联函数定义必须出现在第一次调用之前。对内联函数不能进行异常接口申明。对内联函数不能进行异常接口申明。(4)利用编译预处理宏定义方式,也能够实现类)利用编译预处理宏定义方式,也能够实现类似于内联函数功效。不过,宏定义方式没有类型概似于内联函数功效。不过,宏定义方式没有类型概念,是不安全;内联函数方式更为方便和可靠。念,是不安全;内联函数方式更为方便和可靠。19第19页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.3 5.3 函数嵌套与递归函数嵌套与递归5.3.1 函数嵌套函数嵌套一个函数函数体中包含一个或多个函数调用语句,一个函数函数体中包含一个或多个函数调用语句,即称为函数嵌套。即称为函数嵌套。函数嵌套调用所占用空间(如赋值参数创建等等)函数嵌套调用所占用空间(如赋值参数创建等等)用堆栈(用堆栈(stack)方式管理。普通这种堆栈所分配)方式管理。普通这种堆栈所分配空间是有限,所以函数相互嵌套层数也是有限,空间是有限,所以函数相互嵌套层数也是有限,依编译系统不一样,其允许嵌套层数也可能不一依编译系统不一样,其允许嵌套层数也可能不一样。样。20第20页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载嵌套调用和返回示图:Main()函数调用f1函数结束f1函数调用f2函数结束f2函数结束21第21页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.3.2 函数递归函数递归函数函数A A 在其函数体中直接包含它自己调用语句,在其函数体中直接包含它自己调用语句,函数函数A A 称为(直接)递归函数。称为(直接)递归函数。函数函数A A 在其函数体中间接地包含对它自己调用,在其函数体中间接地包含对它自己调用,比如比如A A 调用函数调用函数B,B,但函数但函数B B 又调用函数又调用函数A A,则函数,则函数A A 称为(间接)递归函数。称为(间接)递归函数。不论是直接递偿还是间接递归都必须确保在有限不论是直接递偿还是间接递归都必须确保在有限次调用之后能够结束。次调用之后能够结束。函数调用时系统要付出时间和空间代价,在功效函数调用时系统要付出时间和空间代价,在功效相同情形下,总是非递归程序效率较高。相同情形下,总是非递归程序效率较高。22第22页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载/*利用递归调用求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即: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)23第23页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.4 5.4 函数与运算符重载函数与运算符重载函数重载实际上是函数名重载,即支持多个不一函数重载实际上是函数名重载,即支持多个不一样函数采取同一名字。(这一点在样函数采取同一名字。(这一点在C 语言和其它语语言和其它语言中是不允许。)言中是不允许。)函数重载并不是为了节约标识符,而是为了方便函数重载并不是为了节约标识符,而是为了方便程序员使用。程序员使用。5.4.1 5.4.1 函数重载函数重载实现函数重载必须满足以下条件之一;实现函数重载必须满足以下条件之一;(1 1)参数表中对应参数类型不一样;)参数表中对应参数类型不一样;(2 2)参数表中参数个数不一样:)参数表中参数个数不一样:(3 3)参数表中不一样类型参数次序不一样。)参数表中不一样类型参数次序不一样。重载函数例程:重载函数例程:p5_0.cpp24第24页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载在定义同名函数时应注意:在定义同名函数时应注意:(1 1)返回类型不能区分函数。)返回类型不能区分函数。比如:float add(int,float);int add(int,float);/错误(2 2)采取引用参数不能区分函数。)采取引用参数不能区分函数。比如:void print(double);void print(double);/错误 void print(const double);/错误(3 3)有些派生基本类型参数即使能够区分同名函)有些派生基本类型参数即使能够区分同名函数,但在使用中必须注意可能出现二义性。数,但在使用中必须注意可能出现二义性。25第25页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(4 4)包含可缺省参数时,可能造成二义性,程序设)包含可缺省参数时,可能造成二义性,程序设计中应防止这种情形出现。计中应防止这种情形出现。比如:int sum(int a,int b,int c0);int sum(int a,int b);(5 5)参数名不能区分函数。)参数名不能区分函数。比如:int sum(int a,int b);int sum(int x,int y);(6 6)不要将不一样功效函数定义为重载函数,以免)不要将不一样功效函数定义为重载函数,以免出现对调用结果误解,但语法上是允许。出现对调用结果误解,但语法上是允许。26第26页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载碰到无准确匹配函数定义时,碰到无准确匹配函数定义时,C+系统并不马上按犯错系统并不马上按犯错处理,它按下面方式处理:处理,它按下面方式处理:(1)经过数组名与指针变量,函数名与函数指针,某类)经过数组名与指针变量,函数名与函数指针,某类型变量与型变量与const 常量之间转换,再查是否可实现匹配;常量之间转换,再查是否可实现匹配;(2)把实参类型从低到高(按字长由短到长)进行基本)把实参类型从低到高(按字长由短到长)进行基本类型及其派生类型转换,再检验是否可匹配;类型及其派生类型转换,再检验是否可匹配;(3)查有没有已定义可变个数参数函数,如有把它归为)查有没有已定义可变个数参数函数,如有把它归为该函数。该函数。在进行上述尝试性处理之后可能出现仍无匹配或匹配不在进行上述尝试性处理之后可能出现仍无匹配或匹配不唯一情况,这时可能输出犯错信息或错误地运行。唯一情况,这时可能输出犯错信息或错误地运行。27第27页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.4.2 5.4.2 运算符重载运算符重载C+语言要求,大多数运算符都能够重载,包含:语言要求,大多数运算符都能够重载,包含:单目运算符:单目运算符:-,!,!,+,-,new,delete双目运算符:双目运算符:+,-,*,(算术运算)(算术运算),(位运算)(位运算)&,|(逻辑运算)(逻辑运算)=,!=,=(关系运算)(关系运算),*,(赋值运算)(赋值运算),(赋值运算)(赋值运算),(逗号运算)(逗号运算),(IO 运算)运算)(),(),(其它)(其它)28第28页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载不可重载运算符包含:不可重载运算符包含:限定符限定符 .:条件运算符条件运算符?:?:取长度运算符取长度运算符 sizeof算术运算符,逻辑运算符,位运算符和关系运算符算术运算符,逻辑运算符,位运算符和关系运算符中,这些运算都与基本数据类型中,这些运算都与基本数据类型相关,经过运算重载函数定义,使它们也用于一些用相关,经过运算重载函数定义,使它们也用于一些用户定义数据类型。户定义数据类型。赋值运算符,关系运算符,!,指针运算赋值运算符,关系运算符,!,指针运算符和符和*,下标运算符等,它们运算所包括数据,下标运算符等,它们运算所包括数据类型按类型按C+C+程序要求,并非只限于基本数值类型。所程序要求,并非只限于基本数值类型。所以,这些运算符能够自动地扩展到任何用户定义数以,这些运算符能够自动地扩展到任何用户定义数据类型,普通不需作重载定义就可据类型,普通不需作重载定义就可“自动自动”地实现地实现重载。重载。29第29页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载重载之后,运算符优先级和结合性不会改变。重载之后,运算符优先级和结合性不会改变。普通来讲,重载功效应与原有功效相类似,不能改普通来讲,重载功效应与原有功效相类似,不能改变原运算符操作数个数,同时最少要有一个操作对象变原运算符操作数个数,同时最少要有一个操作对象是用户自定义类型。是用户自定义类型。运算符重载普通语法形式为:运算符重载普通语法形式为:函数类型函数类型 operator 运算符运算符(形参表形参表)运算符重载函数调用方式有两种:运算符重载函数调用方式有两种:(1 1)与原运算符相同调用方式。如)与原运算符相同调用方式。如b1+b2,b1*b2(2)普通函数调用方式。如普通函数调用方式。如b1+b2,也能够写为,也能够写为operator+(b1,b2)例:复数加减:例:复数加减:p5_1.cpp30第30页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载在在C+中运算符重载普通针对类,重载有两种形式:中运算符重载普通针对类,重载有两种形式:重载为类组员函数和重载为类外函数。重载为类组员函数和重载为类外函数。当重载为类组员函数时,函数参数个数比原来操作当重载为类组员函数时,函数参数个数比原来操作数个数要少一个(后缀数个数要少一个(后缀+、-除外);当重载为类除外);当重载为类外函数时,函数参数个数与原来操作数个数相等。外函数时,函数参数个数与原来操作数个数相等。单目运算符单目运算符+和和-实际上各有两种使用方法,前缀实际上各有两种使用方法,前缀增(减)量和后缀增(减)量。其运算符重载函数增(减)量和后缀增(减)量。其运算符重载函数定义当然是不一样,对两种不一样运算无法从重载定义当然是不一样,对两种不一样运算无法从重载函数原型上给予区分:函数名(函数原型上给予区分:函数名(operator+)和参)和参数表完全一样。为了区分前缀数表完全一样。为了区分前缀+和后缀和后缀+,C+语语言要求,在后缀言要求,在后缀+重载函数原型参数表中增加一个重载函数原型参数表中增加一个int 型无名参数。其原型形式为:型无名参数。其原型形式为:31第31页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载前缀前缀+类型类型operator+()/作为类组员作为类组员 类型类型operator+(类型)(类型)/作为类外函数作为类外函数后缀后缀+类型类型operator+(int)/作为类组员作为类组员 类型类型operator+(类型,(类型,int)/作为类外函数作为类外函数关于减量运算符重载方式相同。其调用方法为:关于减量运算符重载方式相同。其调用方法为:前缀前缀+a 或或a.operator+()()operator+(a)后缀后缀+a+或或a.operator+(0)operator+(a,0)32第32页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.5 5.5 函数与函数与C+C+程序结构程序结构5.5.1 5.5.1 库函数使用库函数使用 库函数又叫标准函数,程序员可直接调用,但库函数又叫标准函数,程序员可直接调用,但要在程序开头说明库函数所在头文件。如:要在程序开头说明库函数所在头文件。如:#include#include#include#include 5.5.2 SP5.5.2 SP框架结构框架结构5.5.3 5.5.3 函数间数据传递函数间数据传递经过赋值参数和返回语句经过赋值参数和返回语句经过全局变量经过全局变量经过指针类型参数和引用型参数经过指针类型参数和引用型参数经过数组类型参数(本质上与指针类型参数相同)经过数组类型参数(本质上与指针类型参数相同)33第33页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.5.4 5.5.4 变量与函数作用域变量与函数作用域1.1.外部存放属性与静态存放属性外部存放属性与静态存放属性整个程序(外部函数、类、非静态全局变量)整个程序(外部函数、类、非静态全局变量)程序文件(静态函数、静态全局变量)程序文件(静态函数、静态全局变量)函数(局部变量、静态局部变量、形参)函数(局部变量、静态局部变量、形参)程序块(复合语句)(块内定义局部变量)程序块(复合语句)(块内定义局部变量)C+程序中标识符作用域有下面几个等级:程序中标识符作用域有下面几个等级:2.2.名字(标识符)生存期与作用域名字(标识符)生存期与作用域外部存放属性:外部存放属性:在全部函数、类、名字空间外说明在全部函数、类、名字空间外说明标识符。标识符。静态存放属性:静态存放属性:加以限定后使标识符作用域限定于加以限定后使标识符作用域限定于其所在文件中有效。如:静态全局变量、静态局部其所在文件中有效。如:静态全局变量、静态局部变量、静态函数。变量、静态函数。34第34页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载5.6 5.6 程序实例程序实例1.“1.“三色冰激凌三色冰激凌”程序程序 由冰激凌商提出问题:有由冰激凌商提出问题:有2828种颜色原料,能够种颜色原料,能够组合成多少种组合成多少种3 3色冰激凌。问题归结为计算排列数色冰激凌。问题归结为计算排列数与组合数。与组合数。2.Hanoi2.Hanoi塔问题塔问题 古印度著名智力测验问题:有三个立柱古印度著名智力测验问题:有三个立柱A A、B B、C C,在,在A A柱上穿有大小不等圆盘柱上穿有大小不等圆盘6464个,较大个,较大圆盘在下,较小者在上。要求借助于圆盘在下,较小者在上。要求借助于B B柱将柱将A A柱柱上上6464个圆盘移到个圆盘移到C C柱,规则为:柱,规则为:程序:程序:p5_4.cpp35第35页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载(1)(1)每次只能把一个柱上最上面圆盘移至另一个柱最每次只能把一个柱上最上面圆盘移至另一个柱最上面上面;(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(n,A,B,C);36第36页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载总任务可分解为与其等价三个子任务总任务可分解为与其等价三个子任务(“(“合集合集”)(“”)(“度度”小于等于小于等于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柱上柱上(又一次递归调用又一次递归调用)。37第37页第五章第五章 函数,函数与运算符的重载函数,函数与运算符的重载靠下面三个调用语句来完成:靠下面三个调用语句来完成: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.cpp38第38页展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




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



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/4149059.html