• C++中一个函数隐藏的有趣例子


    函数隐藏是一个函数的定义或声明导致其他一些函数不可见。
    函数A隐藏函数B的条件:
         1. 两个函数具有相同的函数名称
         2. 具有不同的作用域。所谓定义域函数定义或声明的位置,如全局作用域,文件作用域,类作用域等。
         
    需要注意的是函数隐藏可以由声明来导致,不一定非要有定义造成. 后面的有趣的使用例子说明了这一点。

    函数隐藏出现的一些场合

    1. 全局作用域和文件作用域的隐藏
    2. 全局作用域和局部作用域
    3. 文件作用域和局部作用域

    个人认为隐藏容易导致一些藏得很深的问题,而且不易理解和调试. 也许应该避免函数隐藏.

    下面是这个例子. (该例子只是作为演示函数重载和隐藏的例子. 仅有功能而说,有理由相信,有更好的实现)

    #include <iostream>
    using namespace std;
    #define USE_LONG

    static void method(int a)
    {
        cout<<"in method(int)"<<endl;
    }
    static void method(long a)
    {
        cout<<"in method(long)"<<endl;
    }
    int main(int argc, char *argv[])
    {
        #ifdef USE_INT
            void method(int);
        #endif // USE_INT

        #ifdef USE_LONG
            void method(long);
        #endif // USE_LONG

        method(10);
        return 0;
    }


    当定义宏  USE_INT时,执行结果为: in method(int);
    当定义宏 USE_LONG时,执行结果为:in method(long);


    该例子中,如果定义USE_INT, 则在main函数体内声明 void method(int). 如果声明USE_LONG, 则在main函数体内声明void method(long).  
    函数体内声明后,该函数就具有了局部作用域,此时将会覆盖另外一个函数。
    如果同时定义USE_INT和USE_LONG, 猜一下会是什么结果那?
    答案是in method(int);
    原因在于此时两个函数都具有了局部作用域,形成了函数重载。

    另外,如果对JavaScript的函数调用链有一定了解。那函数隐藏就是个小菜了。
  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3177916.html
Copyright © 2020-2023  润新知