函数就像工具,工具有好多种,我们就以螺丝刀为例来感受一下它和函数重载和模板的一些相似关系。
螺丝刀的种类有很多,常见的是一字型和梅花型, 每种类型从小到大又有好多个号。 我们根据螺丝样式和大小
选择使用那种类型的和选择多大号的螺丝刀。 螺丝刀就干了一件事,拧螺丝,也就是说各种螺丝刀他们的功能是相
同的,只是类型不同而已。
一、函数重载
在C++中,允许用一个函数名来表达功能相同,只是操作类型(形参个数和类型)不同的函数,这就是函数重载。
编译器能够根据他们各自的实参和形参以及参数的个数进行最佳分配,自动决定调用哪一个函数体。看下面这个例
子。
#include<iostream> using namespace std; int add(int x,int y) //一字 螺刀(一字,5号) { cout<<"(int,int)\t"; return x+y ; } double add(double x ,double y) //梅花 螺刀(梅花,5号) { cout<<"(double,double)\t"; return x+y; }<span style="font-size:18px;"> </span>
明白了函数重载我们还得注意一个问题:
如果函数名相同、形参表也相同,仅仅是返回类型不同,是非法的。就像下面这个例子一样,当需要一字5号螺丝刀
时,不知道选哪个类型的螺刀。
int add(int x,int y) //一字 螺刀(一字,5号) { cout<<"(int,int)\t"; return x+y ; } double add(int x,int y) //梅花 螺刀(一字,5号) { cout<<"(double,double)\t"; return x+y; } <span style="font-size:18px;"></span>
二、函数模板
螺丝刀机器可以制造出不同类型的螺丝刀,在这里有个函数模板,能够生成不同类型的函数。
模板形式为:
template <class 类型名1,class 类型名2,…> 返回类型 函数名 (形参表) { 函数体; }
我们来看看螺丝刀时如何制作的
#include<iostream> using namespace std; template <样式类,规格类> 样式1 螺刀(样式1,规格1) { 加工; 返回成品; } int main() { cout<<螺刀(一字,5号)<<endl; cout<<螺刀(梅花,5号)<<endl; return 0; }
最后成品分别为 一字 螺刀(一字,5号) 和 梅花 螺刀(梅花,5号)
三、区别和联系
将逻辑功能相同的而函数参数和函数值类型不同的多个重载函数用一个函数来描述,函数模板创建一个通用功能
函数,支持多种不同的形参,简化了重载函数的函数体设计,使代码的可重用性大大提高,从而提高软件的开发效
率。我们需要什么工具,就把参数给机器,直接加工出来使用即可。