对于C++中函数的重载,我们先来看看下面的几行代码:
很简单的两个函数,我们可以发现,其实这两个函数都是为了实现同一个功能:判断形参是正数还是负数,如果是正数则返回自己,如果是负数则返回相反数。
功能一样的函数却因为形参的不同要弄出两个函数来,显然有点啰嗦了,所以为了提高代码的简洁,C++提出了函数重载功能。
我们先来看看怎样才能实现函数重载:
1.函数名相同
2.参数的个数、类型、排序不相同
3.返回值的类型不同不能构成重载
实践是检验真理的唯一标准,那么我们来看看代码吧!
这段代码中,我们定义了两个同名函数,它们不但没有被报错,反而还能正常地执行。我们发现,其实它们真正的不同也只有形参的类型不同(printf函数里随便输出的就忽略了)。
从打印的结果我们可以发现,当形参是整数时,自动调用了形参是整数的那个函数,而当形参是2.5时,就调用了下面的print函数。
其实print函数是实现了重载!
我们再往下看:
3个print由于形参的类型或形参的个数或排列方式的不同,构成了C++伟大的函数重载。
我们还说,函数的返回值不同不能构成函数重载,我们来试一试:
代码编译出错了,ambiguating就是二义性的意思。
函数重载遵循严格的调用匹配原则,这点我们需要特别注意。
匹配原则:
1.严格匹配,找到则调用
2.通过隐式转换寻求一个匹配,找到则调用
例如:
我们知道‘a’是个字符,它通过隐式转换寻找到了int,所以程序调用了第一个print函数。
我们需要注意的是,C++允许,int到long和double,double到int和float的隐式类型转换,遇到这种情形,则会引起二义性。
上面的代码都编译错误了,因为对于int可以隐式转换成long或者double,double可以隐式转换成int和float,计算机不知道选择哪个函数来实现,所以就报错了。
Kyrie Irving___全.