• ca69a.cpp_c++_函数匹配(重载确定)


    /*ca69a.cpp_c++_函数匹配(重载确定)
    #重载确定的三个步骤
    1.候选函数
    2.选择可行函数
    3.寻找最佳匹配(如果有的话)
    #含有多个形参的重载确定

    void f1();
    void f1(int);
    void f1(int,int);
    void f1(double,double = 3.14);
    f1(5,6) //调用void f1(double,double)

     一、确定候选函数和可行函数

      函数匹配的第一步是选择本次调用对应的重载函数集,集合中的函数成为候选函数。

      候选函数特征:

      1、与被调函数的函数同名

      2、其声明在调用点可见

      在上面的例子中,有4个名为f的候选函数。第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数成为可行函数,可行函数特征:

      1、形参数量与本次调用提供的实参数量相等,而是每个实参的类型与对应的形参类型相同,或者能够转化为形参的类型。

      2、每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型。

      我们能根据实参的数量从候选函数中排除掉两个,无参数和两个int类型参数都不行,而一个int和默认值的两个double类型都是可行的。

      二、寻找最佳匹配

      函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。在这一过程中,逐一检查函数调用提供的实参。

      如果有多个可行函数,那么编译器依次检查每个实参以确定哪个函数是最佳匹配。如果有且只有一个函数满足下列条件,则匹配成功:

      · 该函数每个实参的匹配都不劣于其他可行函数需要的匹配

      · 至少有一个实参的匹配优于其他可行函数提供的匹配

      若无函数脱颖而出,编译器会报错,认为此为二义性调用。

      三、实参类型转换

      1、精确匹配,包括以下情况:

      · 实参类型和形参类型相同

      · 实参从数组类型或函数类型转换成对应的指针类型

      · 向实参添加顶层const或者从实参中删除顶层const

      2、通过const转换成实现的匹配

      如果重载函数的区别在于它们引用类型的形参是否引用了const,或者指针类型的形参是否指向const,则当调用发生时编译器通过实参是否为常量来决定哪个函数

    txwtech
    */

     1 /*ca69a.cpp_c++_函数匹配(重载确定)
     2 #重载确定的三个步骤
     3 1.候选函数
     4 2.选择可行函数
     5 3.寻找最佳匹配(如果有的话)
     6 #含有多个形参的重载确定
     7 
     8 void f1();
     9 void f1(int);
    10 void f1(int,int);
    11 void f1(double,double = 3.14);
    12 f1(5,6)    //调用void f1(double,double)
    13 
    14  一、确定候选函数和可行函数
    15 
    16    函数匹配的第一步是选择本次调用对应的重载函数集,集合中的函数成为候选函数。
    17 
    18   候选函数特征:
    19 
    20   1、与被调函数的函数同名
    21 
    22   2、其声明在调用点可见
    23 
    24   在上面的例子中,有4个名为f的候选函数。第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数成为可行函数,可行函数特征:
    25 
    26   1、形参数量与本次调用提供的实参数量相等,而是每个实参的类型与对应的形参类型相同,或者能够转化为形参的类型。
    27 
    28   2、每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型。
    29 
    30   我们能根据实参的数量从候选函数中排除掉两个,无参数和两个int类型参数都不行,而一个int和默认值的两个double类型都是可行的。
    31 
    32   二、寻找最佳匹配
    33 
    34   函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。在这一过程中,逐一检查函数调用提供的实参。
    35 
    36   如果有多个可行函数,那么编译器依次检查每个实参以确定哪个函数是最佳匹配。如果有且只有一个函数满足下列条件,则匹配成功:
    37 
    38   · 该函数每个实参的匹配都不劣于其他可行函数需要的匹配
    39 
    40   · 至少有一个实参的匹配优于其他可行函数提供的匹配
    41 
    42   若无函数脱颖而出,编译器会报错,认为此为二义性调用。
    43 
    44   三、实参类型转换
    45 
    46   1、精确匹配,包括以下情况:
    47 
    48   · 实参类型和形参类型相同
    49 
    50   · 实参从数组类型或函数类型转换成对应的指针类型
    51 
    52   · 向实参添加顶层const或者从实参中删除顶层const
    53 
    54   2、通过const转换成实现的匹配
    55 
    56   如果重载函数的区别在于它们引用类型的形参是否引用了const,或者指针类型的形参是否指向const,则当调用发生时编译器通过实参是否为常量来决定哪个函数
    57 
    58 txwtech
    59 */
    60 #include <iostream>
    61 using namespace std;
    62 
    63 void f()
    64 {
    65     cout << "f()被调用" << endl;
    66 }
    67 void f(int a)
    68 {
    69     cout << "f(a)被调用" << endl;
    70 }
    71 void f(int a, int b)
    72 {
    73     cout << "f(int a, int b)被调用" << endl;
    74 }
    75 void f(double a, double b=3.14)
    76 {
    77     cout << "f(double a, double b=3.14)被调用" << endl;
    78 }
    79 void g(int a)
    80 {
    81     cout << " g(int a)被调用" << endl;
    82 }
    83 
    84 int main()
    85 {
    86     f(8);                              
    87     f(5.6);//二个可行函数。f(int a),//f(double a, double b=3.14)是最佳匹配
    88     //f(42,2.56); //找不到合适参数进行匹配,存在二义性
    89     //f(2.56,88);//找不到合适参数进行匹配,存在二义性
    90 
    91     f(static_cast<double>(42), 5.56);//c++风格,static_cast强制类型转换,42转double
    92     f((double)42,5.56);//c风格写法强制类型转换
    93     f(12.1,5.6);
    94     f(88, static_cast<int>(5.66));//c++风格,static_cast强制类型转换,5.66转int
    95     f(88,66);
    96     
    97     return 0;
    98 }
    欢迎讨论,相互学习。 txwtech@163.com
  • 相关阅读:
    【硬件】PCB设计步骤
    【modbus】modbus协议入门讲解
    【I2C】上拉电阻的选择
    【运放】失调电压、偏置电流
    【硬件】模拟地和数字地的隔离
    【电力】电流互感器和电压互感器
    【电力】为什么高电压传输时线路损耗小
    【办公】pdf转ppt的方法
    【EMC】电压暂降、短时中断和电压变化
    js 下的 split
  • 原文地址:https://www.cnblogs.com/txwtech/p/12287416.html
Copyright © 2020-2023  润新知