zoukankan      html  css  js  c++  java
  • C++编译器对函数重载决议过程

    转载自《Exceptional C++ style》

    #include <complex>
    
    class Calc
    {
    public:
        double Twice(double);
    private:
        int   Twice(int i);
        std::complex<float>  Twice(std::complex<float c>);      
    };
    
    int main()
    {
        Calc c;
        c.Twice(21);  //编译出错,Twice(int) 不可访问
    }

    编译器在对函数决议时主要做三件事:

    (1)名字查找:编译器会首先寻找至少包含一个名为Twice的实体作用域,并将其放入候选实体列表。本例中,编译器的名字查找首先是从Calc的作用域中开始,编译器会查看Calc中是否至少存在一个名为Twice的成员,如果没有,就会继续依次在其基类和外围空间中查找,直到找到一个至少具有一个候选函数的作用域。本例中在第一个作用域中找到三个候选函数。

    (2)重载决议。编译器在候选的重载函数中选出唯一的最佳匹配。因为c.Twice(21)参数是21int,所以最佳匹配是Twice(int)。注:如果编译器在函数匹配中找不到最佳的匹配就会产生二义性,编译报错

    (3)可访问性检查。最后编译器会检查函数的可访问性,因为Twice(int)是private,不可访问

    总结:函数重载,匹配性比可访问性更重要

  • 相关阅读:
    nullptr和NULL
    tmux用于恢复远程屏幕
    如何改变git的默认路径
    scp拷贝文件
    C++头文件<bits/stdc++.h>
    MAME模拟器使用简单教程
    typescript接口扩展
    Typescript中的可索引接口 类类型接口
    typescript函数类型接口
    typescript静态属性 静态方法 抽象类 多态
  • 原文地址:https://www.cnblogs.com/dj0325/p/12441980.html
Copyright © 2011-2022 走看看