资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,课程,要求,课程,内容,课程,练习,参考,书目,第,三,章,函数和编译处理,课程内容,课程要求,参考书目,返回首页,面向对象程序设计,函数重载,函数定义和调用,内联函数,函数的原型与值调用,函数的嵌套调用和递归调用,3.1 函数的定义和调用,*,3.1.1 函数概述,函数是具有特定功能的模块。在编译过程中,编译系统为函数产生一个接口,以供程序的其它局部使用。,函数包括用户自定义函数和系统库函数。,库函数也称为标准函数,是在C+编译系统中已经预先定义的函数。,在程序设计过程中,用户可根据自己的需要将一段完成功能相对独立的代码定义为一个函数,这类函数称为用户自定义函数。,从函数的形式来看,函数可以分为无参函数、有参函数、无返回值函数和有返回值函数等,prev,next,back,3.1 函数的定义和调用,*,3.1.2,函数的定义,对于用户自定义的函数,要先完成函数的定义,然后才可以调用它。,根据函数定义和使用时参数的不同,可将函数分为两类:无参函数和有参函数。,无参函数就是没有任何参数的函数,而有参函数就是带有一个或一个以上参数的函数。,prev,next,back,3.1 函数的定义和调用,*,3.1.2 函数的定义,1.无参函数,定义无参函数的一般格式为:,?(?void?)/函数体,其中,为函数返回值的类型,它可以是任一标准数据类型或导出数据类型,当没有返回值时,?类型?必须为void。,后的括号()称为函数调用运算符,对于无参函数,函数调用运算符内可以为空,也可以为void。,prev,next,back,3.1 函数的定义和调用,*,3.1.2 函数的定义,2.有参函数,定义有参函数的一般格式为:,?类型?(),其中,为该函数的参数的类型和名字,中的参数称为形式参数或形参,形参的个数是没有限制的,当超过一个参数时,参数间一定要用逗号,分隔开,且每个参数都要有类型说明。,prev,next,back,3.1 函数的定义和调用,*,3.1.2 函数的定义,3.函数返回值和return语句,在前述函数的两种形式中,如果函数名前的不为void,那么称该函数有返回值。函数的返回值也称为函数值。当函数有返回值时,在函数体中必须使用return语句来返回该函数的值。,return语句的一般格式为:,return ;或 return ();,【例3.1】,prev,next,back,3.1 函数的定义和调用,*,3.1.3,函数调用,函数的功能是通过在程序中对其调用来实现的。,调用一个函数,就是把控制权转去执行该函数的函数体,函数体执行完之后,再将控制权转到调用函数处。,无参函数的调用格式一般为:,函数名,(),有参函数的调用格式一般为:,函数名,(),中的参数称为实际参数或,实参,。,prev,next,back,3.1 函数的定义和调用,*,3.1.3,函数调用,函数的调用过程是:先计算各实参表达式的值,(,对有参函数,),,然后将所求的值传递给相应的形参,执行函数体,执行完毕再返回到函数的调用处,继续执行其后继语句。,函数调用的使用方式如下:,(1),对于有返回值的函数,可以用两种方式调用:一种方式是函数调用出现在表达式中;另一种方式是用一个语句来实现调用,称为函数调用语句,此时,函数返回值不起任何的作用。,(2),对于没有返回值的函数,函数调用只能通过函数调用语句实现。,【,例,3.2,】,prev,next,back,3.1 函数的定义和调用,*,3.1.3 函数调用,关于形参和实参,有如下几点说明:,(1)定义函数时指定的形参,在未出现函数调用时,它们不占用内存中的存储单元。只有在函数调用时,形参才被分配内存单元,在调用结束后,形参所占的内存单元也被释放。,(2)调用时是将实参的值传递给形参,此时只是一种单向的传递关系。这是我们所说的“值传递,形参值的改变不会影响实参的。,(3)实参与形参的类型应相同。当类型不一致时,那么它们应该兼容。,prev,next,back,3.2 函数的重载,*,函数的重载又称,函数名重载,,是指同一个函数名可以有多个函数实现,或者说实现不同功能的函数可以具有相同的函数名。,要实现函数名重载,它们的参数必须满足下面两个条件之一:,参数的个数不同,或,参数的类型不同,【,例,3.3,】,(,参数的类型不同,),【,例,3.4,】,(,参数的个数不同,),注意:仅仅是函数返回值不同并不能区分两个函数,因此不能根据函数的返回值定义函数的重载。,prev,next,back,3.3 内联函数,*,在编译调用内联函数的语句时,编译器将内联函数的代码插入到函数调用处,这样在运行过程中,将直接运行插入的代码,而不需要花费实参入栈等一系列的开销。,将一个函数声明为内联函数时,只要在函数定义前加关键字inline即可,格式如下:,inline (?参数表?),【例3.5】,当屡次调用内联函数时,编译生成的目标文件将会增大,因此内联函数常用于简短的函数。,prev,next,back,3.4 函数的原型说明与值调用,*,3.4.1 函数的原型说明,与变量一样,函数的定义和使用也必须遵循先定义后使用的原那么。如果函数的调用在函数的定义之前,就会出现编译错误。【例3.6】,消除这种错误的方法的方法之一是在调用在其后定义函数之前对该函数进行函数的原型说明。,函数原型说明的一般格式为:,?类型?();或,?类型?();,prev,next,back,3.4 函数的原型说明与值调用,*,3.4.1 函数的原型说明,函数原型说明的目的是告诉编译程序,该函数的参数个数、各参数的类型和返回值类型,以便其后调用该函数时,编译程序对函数的参数的类型、个数、顺序及函数的返回值做有效性检查。,函数原型说明可以出现在程序中的任何位置,只要在调用前即可,且对函数原型说明的次数没有限制。,注意,函数的原型说明只是引用性说明,它以分号结束,没有函数体局部。而函数的定义那么必须有函数体。,prev,next,back,3.4 函数的原型说明与值调用,*,3.4.2,函数的值调用,传值调用简称为,值调用,。,值调用的特点是:在被调用函数的执行过程中,只能改变形参,不能改变实参。,【,例,3.7】,prev,next,back,3.5 函数的嵌套调用和递归调用,*,3.5.1,函数的嵌套调用,函数不允许嵌套定义,即不允许在其函数体内再定义另一个函数。,但是函数之间的嵌套调用是可以的,即在定义一个函数时,在函数体内又调用另一个函数。,3.5.2,函数的递归调用,在,C+,中,有两种递归调用:,直接递归,即在函数,A,的定义中调用函数,A,。,间接递归,即在函数,A,的定义中调用函数,B,,而在函数,B,的定义中又调用了函数,A,。,【,例,3.9】,prev,next,back,3.5 函数的嵌套调用和递归调用,*,函数递归调用方法有如下两要素:,递归公式:这是递归的先决条件,它决定问题能否用递归方法解决。,结束条件:确定何时结束递归,该条件是不可缺少的而且必须是可到达的,否那么会出现无穷递归。,函数递归调用举例:,【例3.10】逐位正序和反序输出 一整数。,【例3.11】Hanoi汉诺塔问题。,prev,next,back,
展开阅读全文