欢迎光临
我们一直在努力

C++ 知识点04 函数重载

C++ 函数重载

一、什么是函数重载

同一个作用域下,函数名相同,但参数列表不同,构成函数重载。

简单说:同名不同参,就是重载。

二、构成重载的条件(必记)

满足下面任意一种就算重载:

  • 参数个数不同

  • 参数类型不同

  • 参数顺序不同(不同类型参数调换顺序)

  • ⚠️ 不算重载的情况

    • 只有返回值不同,不算重载

    • 只有参数名不同,不算重载

    • 加缺省参数造成歧义,不算合法重载


    三、基础代码示例 1:参数个数不同

    #include <iostream>
    using namespace std;
    ​
    // 两个同名函数,参数个数不一样
    void print(int a)
    {
       cout << "一个整数:" << a << endl;
    }
    ​
    void print(int a, int b)
    {
       cout << "两个整数:" << a << " " << b << endl;
    }
    ​
    int main()
    {
       print(10);
       print(10, 20);
       return 0;
    }

    运行结果:

    一个整数:10
    两个整数:10 20

    编译器根据你传的参数个数自动匹配对应函数。


    四、代码示例 2:参数类型不同

    #include <iostream>
    using namespace std;
    ​
    void show(int x)
    {
       cout << "整型版本:" << x << endl;
    }
    ​
    void show(double x)
    {
       cout << "浮点版本:" << x << endl;
    }
    ​
    int main()
    {
       show(66);
       show(3.14);
       return 0;
    }

    运行结果:

    整型版本:66
    浮点版本:3.14

    同函数名,参数类型不一样,构成重载。


    五、代码示例 3:参数顺序不同(不同类型)

    #include <iostream>
    using namespace std;
    ​
    void fun(int a, double b)
    {
       cout << "int 在前,double 在后\\n";
    }
    ​
    void fun(double a, int b)
    {
       cout << "double 在前,int 在后\\n";
    }
    ​
    int main()
    {
       fun(10, 3.14);
       fun(3.14, 10);
       return 0;
    }

    运行结果:

    int 在前,double 在后
    double 在前,int 在后

    类型顺序不同,也构成重载。


    六、重点坑点 1:只有返回值不同,不构成重载

    错误代码(编译报错)

    #include <iostream>
    using namespace std;
    ​
    // 只改返回值,参数完全一样,不叫重载
    int getNum()
    {
       return 1;
    }
    ​
    double getNum()
    {
       return 3.14;
    }
    ​
    int main()
    {
       // 编译器不知道调用哪个
       getNum();
       return 0;
    }

    记住:返回值不能作为重载依据。


    七、重点坑点 2:参数名不同不算重载

    // 完全一样,只是参数名字不一样,不是重载
    void f(int a);
    void f(int b);

    编译器认为是重复定义,直接报错。


    八、重点坑点 3:函数重载 + 缺省参数 产生歧义

    #include <iostream>
    using namespace std;
    ​
    void test(int a)
    {
       cout << "test(int)\\n";
    }
    ​
    // 带缺省参数
    void test(int a, int b = 10)
    {
       cout << "test(int,int)\\n";
    }
    ​
    int main()
    {
       // 报错!二义性
       // 既可以调用 test(int),也可以 test(5,默认值)
       test(5);
       return 0;
    }

    结论:重载尽量别和缺省参数混用,容易歧义。


    九、函数重载匹配规则(编译器怎么选)

  • 严格匹配:参数类型、个数完全一致,优先调用

  • 隐式类型转换匹配(int→double 等)

  • 都匹配不上 → 编译报错


  • 十、总结一句话背下来

  • 函数重载:同作用域、同名、参数列表不同

  • 参数不同分三种:个数、类型、类型顺序

  • 返回值、参数名 不能当重载条件

  • 重载和缺省参数容易产生二义性,尽量避开

  • 编译器靠实参的个数和类型自动匹配函数

  • 赞(0)
    未经允许不得转载:171主机测评 » C++ 知识点04 函数重载
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址