打印
[ZLG-ARM]

函数指针的解引用 (转)

[复制链接]
1253|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3B1105|  楼主 | 2011-12-28 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
声明函数的引用:
    int f( double );  
  • int (* const pf)(double) = f;       // pf是指向函数f()的常量指针
  • int (&rf)(double) = f;               // rf是函数f()的引用
从编码实践角度来看,指向函数的常量指针和函数的引用并无很大不同。除了一点,那就是指针可以显式地使用反引用语法,而对引用是不能使用显式反引用语法的,除非它被隐式转换成指向函数的指针 。
    a = pf( 12.3 );                      // 直接用函数指针名调用函数   
  • a = (*pf)(12.3);                    // 使用反引用语法也是可以的a = rf( 12.3 );                      // 通过引用调用函数   
  • a = f( 12.3 );                       // 直接调用函数本身a = (*rf)(12.3);         // 把引用(隐式)转换成指向函数的指针,再使用反引用语法   
  • a = (*f)(12.3);          // 把函数本身(隐式)转换成指向函数的指针,再使用反引用语法
(注:此处六行代码主要想说明,C++的函数调用很灵活,无论是通过使用函数名本身、指向函数的指针还是函数的引用来调用函数,都既可以用名字本身,也可以使用反引用语法。尽管后两行在语法上其实是经过了一个隐式类型转换,因而会带来效率上的损失。)
这是《C++语言99个常见编程错误》错误5中的一段话。

说反引用可能有点莫名奇妙,其实它就是解引用,只是翻译过来不同罢了。

上面声明函数指针时,
int(* const pf)(double)易可为int(* const pf)(double) = &f; 此处的原因为:将一个函数的地址初始化或赋值给一个指向函数的指针时,无需显式地取得函数地址,编译器知道隐式地获得函数的地址,即在此种情况下,&操作符是可选的,通常省略不用。

然后对于引用的解引用,由编译器隐式转换成指向函数的指针,否则编译不通过。
当然要是真想编无聊的代码,后两句可以类似写成这样 a = (*****************rf)(12.3);    其中意思参考上面你应该懂的。

相关帖子

沙发
bairan168| | 2011-12-28 20:07 | 只看该作者
楼主好多资料哈,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://yiguibugui.taobao.com/

315

主题

1645

帖子

4

粉丝