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

函数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. Java----多线程知识点归纳(概念)

    一.线程与进程的区别: 多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响. ?线程本身的数据通常只有寄存器数据,以及一个 程序执行时使用的堆栈,所以线程 ...

  2. 完美让IE兼容input placeholder属性的jquery实现

    调用时直接引用jquery与下面的js就行了,相对网上的大多数例子来说,这个是比较完美的方案. /* * 球到西山沟 * http://www.cnzj5u.com * 2014/11/26 12:1 ...

  3. 【BZOJ3295】【块状链表+树状数组】动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  4. 【BZOJ1012】【树状数组求区间最值】最大数maxnumber

    Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. ...

  5. input+div 下拉选择框

    前台html页面 <html> <head> <meta name="viewport" content="width=device-wid ...

  6. [Winfrom] 捕获窗体最大化、最小化和关闭按钮的事件

    const int WM_SYSCOMMAND = 0x112;const int SC_CLOSE = 0xF060;const int SC_MINIMIZE = 0xF020;const int ...

  7. 在CMD下用java命令出现“找不到或无法加载主类”问题

    解决思路: 从网上查找原因和解决方法,有提到环境变量classpath设置问题,但多次尝试问题依旧没有解决.然后使用java -cp %classpath; Hello执行,结果正确. 使用echo  ...

  8. Json串到json对象的转换

    JSON(JavaScript Object Notation) JS对象符号 是一种轻量级的数据交换格式 JavaScript eval()函数实现 (一) 标准格式 function JsonFo ...

  9. 【技术宅11】php入门运算

    //1.空bool $a=''; $b=NULL; $c=false; $d=0; $e='0'; $f=array(); $g=array(array()); $h='NULL'; var_dump ...

  10. Linux删除用户

    删除用户 # userdel abc 该删除操作将用户删除但保留用户的home文件夹和邮件文件夹.并且当用户abc正在登录的时候,删除操作将失败,如下: # userdel abc userdel: ...