zoukankan      html  css  js  c++  java
  • 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的函数调用链有一定了解。那函数隐藏就是个小菜了。
  • 相关阅读:
    R语言学习——数据框
    R语言学习——数组
    R语言学习——矩阵
    R语言学习——向量
    SSM的项目结构
    simple-spring-memcached简介
    Arrays
    AbstractCollection 类
    Collections 类
    Map接口
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3177916.html
Copyright © 2011-2022 走看看