【考点一】 函数定义在标准C+ +中,函数的定义形式为:<返回类型><函数名>(<形参列表>){<函数体>}<函数名>一般是标识符,一个程序只有一个main函数,其他函数名可随意取(当然,必须避免使用C+ +的关键字),好的程序设计风格要求函数名是取有助于记忆的名字,如getchar函数,通过函数的名字可以知道函数的功能,这无疑会增加程序的可读性。<形参列表>是由逗号分隔的,分别说明函数的各个参数。形参将在函数被调用时从调用函数那里获得数据。在C+ +中,函数形参列表可以为空,即一个函数可以没有参数。但即使函数形参列表为空,括起函数参数的一对圆括号也不允许省略。<返回类型>又称函数类型,表示一个函数所计算(或运行)的结果值的类型。如果一个函数没有结果值,如函数仅用来更新(或设置)变量值、显示信息等,则该函数返回类型为void类型。一个没有返回值的函数类似于一些程序语言(如pascal语言)中的过程(procedure)。由一对花括号括起来的<函数体>是语句的序列,它定义了函数应执行的具体操作。需要注意的是,C+ +不允许函数定义嵌套,即在一个函数体内不能包含有其他函数的定义。
【考点二】 函数调用C+ +中函数调用的一般形式为:<函数名>(<实参表>)当调用一个函数时,其实参的个数、类型及排列次序必须与函数定义时的形参相一致,也就是说实参与形参应该一对一地匹配。当函数定义时没有形参,则函数调用时,<实参表>亦为空。依据对函数返回值的使用方式,函数的调用方法可分为以下几种:(1)语句调用,这通常用于不带返回值的函数。这种情况下,被调用函数作为一个独立的语句出现在程序中。(2)表达式调用。将被调用函数作为表达式的一部分来进行调用。它适用于被调用函数带有返回值的情况。(3)参数调用。被调用函数作为另一个函数的一个参数进行调用。
【考点三】 函数原型在C+ +中,函数在使用之前要预先声明。这种声明在标准C+ +中称为函数原型(function prototype),函数原型给出了函数名、返回类型以及在调用函数时必须提供的参数的个数和类型。函数原型的语法为:<返回类型><函数名>(<形参列表>);(注意在函数原型后要有分号)实际上函数原型说明有两种形式:(1)直接使用函数定义的头部,并在后面加上一个分号。(2)在函数原型说明中省略参数列表中的形参变量名,仅给出函数名、函数类型、参数个数及次序。注意:在C+ +中,在调用任何函数之前,必须确保它已有原型说明。【考点四】 函数返回类型根据函数是否带有参数以及函数是否有返回值,可以将函数分为如下四类。
1.带参数的有返回值函数定义形式为:<返回类型><函数名>(<参数列表>){<语句序列>}
2.不带参数的有返回值函数定义形式为:<返回类型><函数名>(){<语句序列>}
3.带参数的无返回值函数定义形式为:void<函数名>(<参数列表>){<语句序列>}
4.不带参数的无返回值函数定义形式为:void<函数名>(){<语句序列>}
【考点五】 函数参数C+ +中,函数之间传递参数有传值和传地址两种传递方式。此外,C+ +还提供了默认参数机制,可以简化复杂函数的调用。
1.参数的传递方式(1)传值传值是将实参值的副本传递(拷贝)给被调用函数的形参。它是C+ +的默认参数传递方式,在此之前的多数函数参数传递都是传值。由于传值方式是将实参的值复制到形参中,因此实参和形参是两个不同的变量,有各自的存储空间,可以把函数形参看作是函数的局部变量。传值的好处是函数调用不会改变调用函数实参变量的内容,可避免不必要的副作用。(2)传地址有时我们确实需要通过函数调用来改变实参变量的值,或通过函数调用返回多个值(return语句只能返回一个值),这时仅靠传值方式是不能达到目的。
2.默认参数在C+ +中,可以为参数指定默认值,在函数调用时没有指定与形参相对应的实参时就自动使用默认值。默认参数可以简化复杂函数的调用。默认参数通常在函数名第一次出现在程序中的时候,如在函数原型中,指定默认参数值。指定默认参数的方式从语法上看与变量初始化相似。
【考点六】 函数重载如果能用同一个函数名字在不同类型上做相类似的操作就会方便很多,这种情况即为函数重载。其实这一技术早已用于C+ +的基本运算符。例如加法操作只有一个运算符+,但它却可以用来做整型数、浮点数和指针的加法运算。将这一思想推广到函数,即为函数重载。 【考点七】 内联函数C+ +引入内联(inline)函数的原因是用它来取代C中的预处理宏函数。内联函数和宏函数的区别在于,宏函数是由预处理器对宏进行替换,而内联函数是通过编译器来实现的,因此内联函数是真正的函数,只是在调用的时候,内联函数像宏函数一样的展开,所以它没有一般函数的参数压栈和退栈操作,减少了调用开销,因此,内联函数比普通函数有更高的执行效率。在C+ +中使用inline关键字来定义内联函数。inline关键字放在函数定义中函数类型之前。不过,编译器会将在类的说明部分定义的任何函数都认定为内联函数,即使它们没有用inline说明。
【考点八】 递归函数如果一个函数在其函数体内直接或间接地调用了自己,该函数就称为递归函数。递归是解决某些复杂问题的十分有效的方法。递归适用以下的一般场合。(1)数据的定义形式按递归定义。(2)数据之间的关系(即数据结构)按递归定义,如树的遍历,图的搜索等。(3)问题解法按递归算法实现,例如回溯法等。使用递归需要注意以下几点:(1)用递归编写代码往往较为简洁,但要牺牲一定的效率。因为系统处理递归函数时都是通过压栈/退栈的方式实现的。(2)无论哪种递归调用,都必须有递归出口,即结束递归调用的条件。(3)编写递归函数时需要进行递归分析,既要保证正确使用了递归语句,还要保证完成了相应的操作。