引入
假设如下函数来比较两个int
型数据的大小
int max(int a, int b) {
return a > b ? a : b;
}
当我们需要再增加一个比较两个double
或char
类型的数据时,我们的函数名会变得臃肿,如下所示:
int max_int(int a, int b) {
return a > b ? a : b;
}
int max_double(double a, double b) {
return a > b ? a : b;
}
int max_char(char a, char b) {
return a > b ? a : b;
}
当我们需要比较更多类型数据的大小时,我们的max_xxx
函数会变得越来越多。在进行调用时会越来越麻烦。
函数重载定义
函数重载指的是一个或多个函数,名字相同,然而参数个数以及参数类型不同,我们就称之为函数重载。
将上面的代码改写为如下形势:
int max(int a, int b) {
return a > b ? a : b;
}
int max(double a, double b) {
return a > b ? a : b;
}
int max(char a, char b) {
return a > b ? a : b;
}
这是我们在调用函数时就不需要用函数名去区分该调用哪个函数,此时程序会根据我们的参数个数以及参数类型去选择调用的函数。
如下函数调用代码所示:
#include<iostream>
using namespace std;
int max(int a, int b) {// 1
return a > b ? a : b;
}
int max(double a, double b) {// 2
return a > b ? a : b;
}
int max(char a, char b) {// 3
return a > b ? a : b;
}
int main() {
max(2, 3);//调用 1
max('a', 'b');//调用 3
max(2.3, 3.2);//调用 2
return 0;
}
如上程序,在执行max(2, 3);
时,参数为两个int
类型的,所以自动匹配到调用第1个max
函数。其他两次调用类似。
函数重载使得函数的命名变得简单,调用过程也变得简洁。
注意事项
考察如下函数调用语句:
max(2, 3.1);
当我们进行上述的函数调用时,就会产生二义性。
此时编译器不知道是将3.1
转换为int
去调用max(int a, int b)
,还是将2
转化为double
去调用 max(double a, double b)
。
因此,在调用重载函数时要注意去避免产生二义性。
网友评论