
5.3 有参函数
有参函数就是传递参数的函数,这种函数可以实现变量数据的处理。本节将详细讲解有参函数的定义、调用等相关内容。
5.3.1 有参函数的定义
有参函数由返回类型(return type)、函数名、0或多个形参、函数体组成,其语法形式如下。

形参即形式参数,其本质为一个变量。声明形参后等于为函数声明了变量,可以在函数体内进行使用。形参可以根据需求确定是否定义。参数的个数可以为0个,也可以为多个。如果有多个参数,每个参数之间要使用逗号进行分隔。
形参的作用是用于数据的交互,相当于一个接口,声明形参的语法就是规定接口的数据类型。在函数外可以通过形参将符合接口规格的数据传递到有参函数中,然后等待运算结果即可。
例如,想要使用函数计算两个任意整数的和,就需要定义一个可以实现加法运算并且有两个整型形参的有参函数,这样才能将两个整数传递到函数中进行运算。
【示例5-4】下面定义一个带参的求和函数sum()。

从代码中可以看出,函数sum( )拥有两个int型的参数a和b。它们可以直接在sum()函数中使用,不用再次声明。该函数由于有两个整型形参,所以可以实现对任意两个整数的求和运算。
5.3.2 有参函数的调用
有参函数的调用包括函数名、小括号、实参,其语法形式如下。

其中,实参的个数、出现的顺序及类型要与有参函数定义时的形参的个数、定义的顺序及类型完全一致。另外,实参可以为常数,也可以为同类型的变量。
在调用函数时,通过实参可以将指定的数据传递到指定的函数中,使用同一函数处理不同的数据。这样相当于共享单车一样,只需要刷一下身份数据,不同的人都能享受骑车的权利。
注意:通常,实参的类型需要与形参类型一致。如果类型不同,实参需要符合自动转换的规则,也就是传递的数据要支持C++语言的隐式转换规则。例如,实参a为float类型,对应的形参b为double类型,此时参数传递进行自动转换,将float类型转换为double类型。
【示例5-5】下面调用带参求和函数sum()。


程序运行结果如下。

从运行结果中可以看出,无论传递的实参是常数还是变量都能正常调用求和函数sum( ),并输出对应数字计算的和。语句sum(1,2);的传递过程如图5.5所示。

图5.5 语句sum(1,2);的传递过程
从图中可以看到,实参1会传递到形参a,实参2会传递到形参b。在函数sum( )中计算出和,然后输出运算结果。
5.3.3 返回值
在声明函数时,会规定函数的返回类型。在前文中使用的是void返回类型,即无返回值类型。这种类型的函数没有返回值。在调用无返回值的函数时,只能执行或获得运算通知,无法获取运算的结果。
调用无返回值函数就像发快递,把货物(数据)交给快递公司(函数),你手里就空空如也了,无法获得打包发送后的货物(运算后的数据),如图5.6所示。

图5.6 无返回值函数
如果使用有返回值函数,需要在声明时将void替换为返回数据的类型,还需要使用return语句说明返回的值。有参有返回值函数的语法形式如下。

无参有返回值函数的语法形式如下。

其中,返回类型就是数据类型,如int、float等。返回值的类型需要与函数定义时的返回类型一致或可自动转换。例如,声明的为double类型,返回的为float类型。
在一个函数中可以有多个return返回语句。每个返回语句中,返回值都是表达式。
【示例5-6】下面使用函数返回计算结果,并进行输出。

程序运行结果如下。

从运行结果中可以看出,输入值的计算结果都会被返回,然后在main()函数中参与乘法运算。函数调用与返回值运行过程如图5.7所示。

图5.7 函数调用与返回值运行过程