C++深入学习之彻底理清重载函数匹配

2020-01-06 20:16:34于丽

call function 2

如果把函数1的注释去掉再运行,就会发现,虽然第一个调用既能匹配函数1,也能匹配函数2,但是由于匹配函数2的时候,需要const转换,因此比精确匹配要差,最终,它会调用函数1。
去掉函数1的注释后,运行结果如下:

call function 1

通过类型提升实现的匹配

关于类型提升,这里不多做介绍。简单说明类型提升规则:

  • float将提升到double
  • char、short和相应的signed、unsigned类型将提升到int

    我们来看一个示例:

    
    #include <iostream>
    using namespace std;
    //函数1
    /*
    int f(short a)
    {
     cout<<"call function 1"<<endl;
     return 0;
    }*/
    //函数2
    int f(int a)
    {
     cout<<"call function 2"<<endl;
     return 0;
    }
    int main()
    {
     short a = 2;
     f(a);
     return 0;
    }

    同样地,我们暂时把函数1注释掉。由于a是short类型,但是通过类型提升,可以转换为int,因为它也能调用函数2。运行结果如下:

    call function 2

    但去掉函数1注释后,由于精确匹配优于通过类型提升的匹配,因此将会调用函数1,运行结果如下: