函数隐藏是一个函数的定义或声明导致其他一些函数不可见。

函数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的函数调用链有一定了解。那函数隐藏就是个小菜了。

C++中一个函数隐藏的有趣例子的更多相关文章

  1. Scala中的函数表达式

    最近看Spark的东西,由于之前没有接触过lambda函数表达式,所以搜了点资料,特地纪录在此 Scala中的Lambda表达式 在函数式编程中,函数是基本的构造块.Scala融合了java中的面向对 ...

  2. [php-src]理解Php内核中的函数与INI

    内容均以php-5.6.14为例. 一. 函数结构 内核中定义一个php函数使用 PHP_FUNCTION 宏 包装,扩展也不例外,该宏在 ./main/php.h:343 有着一系列类似以 PHP ...

  3. [VBA]用一个简单例子说明如何在Excel中自定义函数

    Excel中的函数无疑是强大的,但是再强大的战士也有他脆弱的脚后跟[1].这两天在使用Excel的时候遇到了一个需求,要在某一个单元格里面自动计算今天是星期几(如显示 Today is Tuesday ...

  4. 编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。

    题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在ACSII码范围内. 输出描述: 输出范围在( ...

  5. vue中组件的data为什么是一个函数

    1. 前言 在学习vue的时候,一直纳闷一件事:组件的data数据为什么必须要以函数返回的形式,为什么不是简单的对象形式呢?遂带着问题去翻官方文档,文档中自然也写明了这么做的原因,本篇博文以官方文档给 ...

  6. javascript中,一个js中的函数,第一句var _this = this;为什么要这样做?

    javascript中,一个js中的函数,第一句var _this = this;为什么要这样做? 下面是源码: 下面这段代码是常用的网站首页,自动切换span或者tabbar来变更List显示内容的 ...

  7. 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

    一.题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 二.解题思路 1)简单暴力解法 ...

  8. Sql Server 中一个非常强大的日期格式化函数

    Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0)-- 05 16 2006 10:57AMSelect CONV ...

  9. 由项目中一个hash2int函数引发的思考

    hash2int /** * 计算一个字符串的md5折算成int返回 * @param type $str * @return type */ function hash2int($str) { $m ...

随机推荐

  1. 根据CreateDirectory递归创建多级目录

    分为MFC下的和非MFC下的两种,MFC路径是CString类型的,非MFC的路径是wstring类型的. 下面是MFC下的创建目录: void __fastcall RecursiveDirecto ...

  2. 51nod建设国家

    小C现在想建设一个国家.这个国家中有一个首都,然后有若干个中间站,还有若干个城市. 现在小C想把国家建造成这样的形状:选若干(可以是0个)的中间站把他们连成一条直线,然后把首都连在这一条直线的左端.然 ...

  3. WHU 1572 Cyy and Fzz (AC自动机 dp )

    题意: 给出n个串,求任意长度为m的字符串包含串的个数的期望.(n<=8,m<=14,给定串的长度不超过12). Solution: 首先可以想到应该用概率DP,我们需要至少3维,dp[i ...

  4. Java学习随笔——RMI

    RMI(Remote Method Invocation)远程方法注入,用来实现远程方法调用,是实现分布式技术的一种方法.RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建了和服务对象相同的方 ...

  5. 《chkconfig命令》-linux命令五分钟系列之四

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...

  6. Debian 8.0(Jessie) 无线网卡,ATI显卡驱动和输入法等安装记录。

    转载请注明作者与出处!谢谢! 最近准备彻底转换到Linux平台,之前一直用的是Red Hat,对Debian不是很熟悉,花了不少时间摸索.下面记录一下安装的过程以便备忘,顺便给他人能做个参考. 我的是 ...

  7. PHPCMS v9 自定义表单添加验证码验证

    1. 在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id=" ...

  8. CentOS 6.3 卷组挂载硬盘教程 linux的VPS如何分区

    XEN架构VPS提供的容量一般都不会低于10G,但大部分基于Xensystem面板的VPS默认挂载10G硬盘(第一磁盘),剩下的容量(第二磁盘)就需要通过手动挂载才能扩充默认的10G容量了.默认装完系 ...

  9. House Of Hello恶搞包为什么如此受热捧!

    凤凰时尚    在大多数人的心中,奢侈品都是昂贵的,摆在精美的橱窗中,动辄上万的价格,高贵而冷艳,也让很多人望而却步.然而,最近在很多时尚年轻一族中却流传着这样一句话“昂贵不等于奢侈,奢侈是一种生活态 ...

  10. RH6030 单通道触摸感应开关

    1.概述: RH6030 是一款单通道电容式触摸感应控制开关IC,可以替代传统的机械式开关. 该 IC 采用CMOS 工艺制造,结构简单,性能稳定.IC 可通过外部引脚配置成多种工作模式,可广泛应用于 ...