zoukankan      html  css  js  c++  java
  • 【基础】函数重载

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

  • 相关阅读:
    Android中Activity和Fragment之间的通信
    用Android布局和简单控件实现的一个常见的界面
    【Linux】linux常用基本命令 [轉載]
    本地项目上传到gitlab
    spring boot 配置redis
    linux mysql的安装
    linux 安装 java环境变量
    mvc 跨域
    JSON 的几种简单格式和转换
    地区三级联动和全盘扫描索引的建立
  • 原文地址:https://www.cnblogs.com/syxy/p/8490495.html
Copyright © 2011-2022 走看看