21天学通C++(第5版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.1 函数简介

在结构化程序设计中,通常把一个大的程序分成若干个模块,每一个模块完成一个或多个特定功能。每一个模块是相对独立的,却又具有通用性,可供本程序或其他程序调用。这种模块化的设计思想有利于多人协作共同开发程序,函数就是这种设计思想的产物。在结构化程序设计中,函数及其相互之间的调用构成了整个应用程序,如图5-1所示。

图5-1 应用程序与函数

5.1.1 函数概述

在具体讲解如何定义函数和调用函数前,先来了解一下在程序设计语言中为什么要引入函数这个概念。前面说到了,函数有利于模块化,这对于结构化程序是非常方便的。此外,在程序中使用函数还有如下的优势:

●程序可读性好。

●程序易于查错和修改。

●便于分工编写,分阶段调试。

●各个函数之间接口清晰,便于相互间交换信息和使用。

●节省程序代码和存储空间。

●减少用户总的工作量。

●成为实现结构程序设计思想的重要工具。

●能够扩充语言和计算机的原设计能力。

●便于验证程序正确性。

简单地说,设计一个C++程序的过程,实际上就是编写函数的过程,至少也要编写一个main()函数。执行C++程序,也就是执行相应的main()函数,即从main()函数的第一个“{”开始,依次执行后面的语句,直到最后一个“}”为止。

如果在执行过程中遇到其他的函数,则调用其他函数。调用完后,返回到刚才调用函数语句的下一条语句继续执行。而其他函数也只有在执行main()函数的过程中被调用时才会执行。函数可以被一个函数调用,也可以调用另一个函数,它们之间可以存在着调用上的嵌套关系。C++函数是一个独立完成某个功能的语句块,函数与函数之间通过输入和输出来联系。

警告

C++不允许函数的定义嵌套,即在函数定义中再定义一个函数是非法的。

5.1.2 定义函数

在C++程序中调用函数之前,首先要对函数进行定义。如果调用此函数在前,函数定义在后,就会产生编译错误。为了使函数的调用不受函数定义位置的影响,可以在调用函数前进行函数的定义。这样,不管函数是在哪里定义的,只要在调用前进行了函数的定义,就可以保证函数调用的合法性。

函数定义的一般形式如下:

一般来说,函数的定义需要包括以下几个部分。

●函数名:即一个符合C++语法要求的标识符。定义函数名与定义变量名的规则是一样的,但应尽量避免用下画线开头,因为编译器常常定义一些下画线开头的变量或函数。并且函数名应尽可能反映函数的功能,其常常由几个单词组成。如Visual C++中的按下鼠标左键的响应函数为OnLButtonDown,这样就较好地反映了函数的功能。此外,在函数名后面必须跟一对圆括号“()”,用来将函数名与变量名或其他用户自定义的标识符区分开来。在括号中可以没有任何信息,也可以包含形式参数表。C++程序通过使用这个函数名和实参表可以调用该函数。

●参数列表:参数也即0个或多个变量,写在函数名后面的一对圆括号内,用于向函数传送数值或从函数带回数值,其不同于变量定义,每一个参数都有自己的类型。当参数列表中的参数多于一个时,其前后两个参数说明项之间必须用逗号分开。如果参数表列中参数个数为0,称为无参函数,

●返回类型:即指定函数用return返回的函数值的类型,如果函数没有返回值,返回类型应为void。每个函数都有类型,如果在函数定义时没有明确指定类型,则默认类型为int。

●函数体:花括号中的语句称为函数体,一个函数的功能,通过函数体中的语句来完成。函数体是函数的主体部分,其一般是一条复合语句,其以“{”开始,到“}”结束,中间为一条或若干条C++语句,用于实现函数执行的功能。

例如,下面定义一个函数dec,其功能是返回两个数的差值,其函数的定义语句如下:

在上述函数的定义中,函数名为dec,参数列表为int x、int y,返回类型为int,函数体为return(x-y);这条语句。此外,如果需要定义一个无返回值的函数,只需将函数名前的返回类型设置为void即可。例如,下列函数out用于输出两个数的差值及和值。

注意

在函数定义的函数体中可以定义其他变量,或使用前面章节讲解到的流程控制语句,用以完成函数的功能。

例如,下面定义的函数max返回两个数之间的较大数。

除此之外,C++中不允许函数定义嵌套,即在函数定义中再定义一个函数是非法的。一个函数只能定义在别的函数的外部,函数定义之间都是平行的,互相独立的。例如:下面的代码在主函数中嵌套了一个名为f()函数定义,这是非法的。

5.1.3 应用示例

鉴于函数定义的重要性,为了使读者能更好地理解函数的定义,本节给出一个函数定义的应用示例并在主函数中调用,读者就可以理解函数的功能了。

【范例5-1】函数的定义。该范例定义了一个函数func,该函数判断指定的参数与0的比较结果,大于0则返回1,等于0则返回0,小于0则返回-1。并在主函数main()中调用该函数,使读者可以看到该函数的执行结果。程序段如代码清单5-1所示。

代码清单5-1

【运行结果】在Visual C++中运行上述程序,其执行结果如图5-2所示。

图5-2 函数定义

【范例解析】在上述代码中,首先使用函数的定义格式定义了一个函数func,该函数带有一个整型参数,该参数称为形式参数,在调用该函数的时候该参数将会被实际参数的参数所取代,关于形参与实参在后续章节中还将详细介绍。