【基础】函数重载

重载函数是函数的一种特殊情况,为方便使用,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

http://blog.csdn.net/zhanghow/article/details/53588458

https://baike.baidu.com/item/%E9%87%8D%E8%BD%BD%E5%87%BD%E6%95%B0/3280477?fr=aladdin&fromid=9567687&fromtitle=%E5%87%BD%E6%95%B0%E9%87%8D%E8%BD%BD#2

posted @ 2018-03-02 00:58  水汐音  阅读(381)  评论(0编辑  收藏  举报