• C++对C语言的拓展(4)—— 函数重载


      函数重载(Function Overload):用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。

    1、重载规则

    (1)函数名相同;

    (2)参数个数不同,参数的类型不同,参数顺序不同,均可构成重载;

    (3)返回值类型不同则不可以构成重载。

    void func(int a);//OK
    void func(char a);//OK
    void func(char a,int b);//OK
    void func(int a,char b);//OK
    char func(int a);//与第一个函数有冲突

    2、调用规则

    (1)严格匹配,找到则调用;

    (2)通过隐式转换寻求一个匹配,找到则调用;

    #include <iostream>
    using namespace std;
    
    void print1(double a)
    {
        cout << a << endl;
    }
    void print1(int a)
    {
        cout << a << endl;
    }
    int main(void)
    {
        print1(1);//1,    print(int)
        print1(1.1);//1.1,    print(double)
        print1('a');//,97,    print(int)
        print1(1.11f);//1.11    print(double)
    
        return 0;
    }

    编译器调用重载函数的准则:

    1. 将所有同名函数作为候选者
    2. 尝试寻找可行的候选函数
    3. 精确匹配实参
    4. 通过默认参数能够匹配实参
    5. 通过默认类型转换匹配实参
    6. 匹配失败
    7. 最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
    8. 无法匹配所有候选者,函数未定义,编译失败。

    3、重载底层实现(name mangling)

      C++利用 name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数。

      实现原理:用 v c i f l d 表示 void char int float long double 及其引用。

    void func(char a);//func_c(char a)
    void func(char a,int b,double c);//func_cid(char a,int b,double c)

    4、函数重载与函数默认参数

    一个函数,不能既作重载,又作默认参数的函数。当你少写一个参数时,系统无法确认是重载还是默认参数。

    #include <iostream>
    using namespace std;
    
    int func(int a, int b, int c = 0)
    {
        return a*b*c;
    }
    
    int func(int a, int b)
    {
        return a+b;
    }
    
    int func(int a)
    {
        return a;
    }
    int main(void)
    {
        int c = 0;
        c = func(1, 2);//error,存在二义性,调用失败,编译不能通过
        printf("c=%d
    ", c);
        return 0;
    }
  • 相关阅读:
    [C#] 等待启动的进程执行完毕
    C# 、winform 添加皮肤后(IrisSkin2) label设置的颜色 无法显示
    Mysql 备份
    Mysql 慢查询日志配置
    Mysql 忘记密码处理配置
    PHP-FPM 慢执行日志、网站隔离配置
    PHP-FPM 设置多pool、配置文件重写
    Nginx 代理配置
    Nginx 301与302配置
    Nginx URL跳转
  • 原文地址:https://www.cnblogs.com/yuehouse/p/9787031.html
走看看 - 开发者的网上家园