重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,
但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。
这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。但是重载函数的返回值类型可以不同。(来自百度百科)
举个例子
我们要写个求绝对值的函数,因为数据类型不同,导致我们要写一个 整形 和一个 浮点型 一共两个名字不同的求绝对值函数,使用的时候也需要根据变量类型的不同而进行选择
(上面一行所说的前提是在没有或不用函数重载的情况下,并非所有语言都有函数重载这一功能)
但通过函数重载,我们可以把两个函数都命名为同一个名字
把这两个功能相似的函数通过函数重载为两个名字相同的函数,方便了函数调用
值得注意的是,函数重载以 函数参数 作为判断 两个同名的函数 是否是 两个不同的函数的依据
so,改函数的函数类型标识符是没有用的
//错误示例 int abs(int a){ ... } double abs(int a){ ... }
像上面的两个函数,当在 mian 函数中调用 abs 函数时
int main(){ int a; cin >> a; abs(a); return 0; }
系统就会因为不知道调用哪个函数而报错
函数重载规则:
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。
还有一种特殊情况也是要注意的
那就是使用默认形参的重载函数
//错误示例 #include <iostream> using namespace std; int test(int x, int y=5){ ... } int test(int x){ ... } int main(){ int x; cin >> x; test(x); return 0; }
这么写的时候,编译器编译的时候肯定会“懵逼”
这种写法会产生歧义,编译器也不知道你要调用的是哪一个函数
最后,把两个功能完全不同的两个函数命名为同一个名字,这样子是会被拉出去祭天的
/* 摘要:计算 x + y 的值 */ #include <iostream> using namespace std; int test(int x, int y){ return x - y; } int test(int x, double y){ return x + y; } int main(){ int x = 9; int y_1 = 2; double y_2 = 3.0; cout << test(x,y_1) << endl; cout << test(x,y_2) << endl; return 0; }
补充:
函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样
函数签名:
函数签名(Function Signature),函数签名包含了一个函数的信息,包括函数名、它的参数类型、它所在的类和名称空间及其他信息。
函数签名用于识别不同的函数,就像签名用于识别不同的人一样,函数的名字只是函数签名的一部分。
参考资料:
https://www.cnblogs.com/wfwenchao/articles/4140388.html