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

5.6 函数重载

函数重载是指同一个函数名可以对应着多个函数的实现。每一类实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同,这就是函数重载。

例如,给同一个名为sum()的函数定义两个不同的函数体,该函数的功能是求两个操作数的和。其中,一个函数实现求两个整数之和,另一个则求两个浮点型数之和。而这两种功能都可以通过调用同一个sum()函数来实现。

5.6.1 函数重载的定义

函数重载又称为函数的多态性,是指同一个函数名对应着多个不同的函数。所谓“不同”,是指这些函数的形参表必须互不相同,或者是形参的个数不同,或者是形参的类型不同,或者是两者都不相同,否则将无法实现函数重载。例如,下面是合法的重载函数:

重载函数的类型,即函数的返回类型,可以相同,也可以不同。但如果仅仅是返回类型不同而函数名相同、形参表也相同,则是不合法的,编译器会给出语法错误提示。例如:

警告

除形参名外都相同的情况,编译器不认为是重载函数,只认为是对同一个函数原型的多次声明,因此上述声明方法是错误的。

在调用一个重载函数func1()时,编译器必须判断函数名func1到底是指哪个函数。例如,Visual C++中通过编译器,根据实参的个数和类型对所有func1()函数的形参一一进行比较,从而调用一个最匹配的函数。

5.6.2 参数类型不同的函数重载

前面提到了,函数要进行重载,其必须是函数的参数类型不同或个数不同,下面分别介绍这两种不同方式的函数重载的实现。

【范例5-10】参数类型不同的函数重载。该范例给出了两个参数类型不同的函数add,分别用来实现两个整数的相加和两个浮点数的相加,实现代码如代码清单5-10所示。

代码清单5-10

【运行结果】该程序的运行结果如图5-17所示。

图5-17 参数类型不同的函数重载

【范例解析】在该程序中,main()函数中调用相同名字add的两个函数,前边一个add()函数对应的是两个整型int数求和的函数实现,而后边一个add()函数对应的是两个浮点型double数求和的函数实现,这便是函数重载。

提示

读者可以看出,在参数类型不同的情况下,系统能自动分辨在调用时应使用哪个函数,从而得出正确的结果。

5.6.3 参数个数不同的重载函数

前面提到了,除了5.6.2节介绍的参数类型不同的函数可以进行重载外,针对参数个数不同的函数也可以进行重载。

【范例5-11】参数个数上不同的重载函数。该范例定义了3个函数,其函数名都为min,其参数个数分别为2个、3个和4个,其功能分别为取2个、3个和4个整型数据的最小值,其实现代码如代码清单5-11所示。

代码清单5-11

【运行结果】在Visual C++中的运行结果如图5-18所示。

图5-18 参数个数上不同的重载函数

【范例解析】该程序中出现了函数重载,函数名min对应有三个不同的实现,函数的区分依据参数个数不同,在这里的三个函数实现中,参数个数分别为2、3和4,在调用函数时根据实参的个数来选取不同的函数实现。

读者可以看出,在函数调用时,程序自动根据实际参数的个数来选取不同的min()函数,从而得到正确的结果。

提示

事实上,函数重载在类和对象中应用得比较多,尤其是在类的多态性中。