C Pointer-to-Function 与 C++ Pointer-to-MemberFunction 的区别
在看APUE Figure1.10的时候发现signal(SIGINT, sig_int)这里的sig_int直接用的函数名,但是看Thinking-in-C++ Vol.2的时候发现mem_fun(&Shape::draw)却对函数名进行了取地址操作,感觉有疑问就查了一下资料,下面的代码可以展示出这两者之间的一些区别
参考资料:
http://stackoverflow.com/questions/3050805/pointer-to-const-member-function-typedef
http://www.cplusplus.com/reference/functional/mem_fun1_t/
http://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html
http://www.cplusplus.com/reference/functional/mem_fun/
代码:
#include <functional>
#include <iostream>
#include <algorithm> using namespace std; void my(int arg); class MyClass
{
public:
void my(int arg) { cout << arg << endl; }
}; // 方法1,2 typedef void func_ptr(int); // func_ptr与func_ptr2本质是一样的,选择哪种定义方式看你的喜好
typedef void (*func_ptr2)(int); // 参考:http://www.cnblogs.com/qrlozte/p/4439002.html
void dosomething_one(func_ptr ptr);
void dosomething_two(func_ptr2 ptr); // 方法3,4,5 void dosomething_three(void (MyClass::*my_ptr)(int)); typedef void FuncType(int);
typedef FuncType MyClass::*MyClassFuncType; typedef void (MyClass::*MemberFuncType)(int); void dosomething_four(MyClassFuncType ptr); void dosomething_five(MemberFuncType ptr); int main() {
/*
方法1,2本质是一样的
方法3,4,5本质也是一样的
*/
dosomething_one(my);
dosomething_two(my);
dosomething_three(&MyClass::my);
dosomething_four(&MyClass::my);
dosomething_five(&MyClass::my);
return ;
} ///:~ void my(int arg)
{
cout << arg << endl;
} void dosomething_one(func_ptr ptr)
{
ptr();
} void dosomething_two(func_ptr ptr)
{
ptr();
} void dosomething_three(void (MyClass::*my_ptr)(int))
{
MyClass *obj = new MyClass;
(obj->*my_ptr)();
delete obj;
} void dosomething_four(MyClassFuncType ptr)
{
MyClass *obj = new MyClass;
(obj->*ptr)();
delete obj;
} void dosomething_five(MemberFuncType ptr)
{
MyClass *obj = new MyClass;
(obj->*ptr)();
delete obj;
}
C Pointer-to-Function 与 C++ Pointer-to-MemberFunction 的区别的更多相关文章
- pointer to function
指针.函数.数字.结构体.指针函数.函数指针 初学不好区分,做点儿实验来有效区分一下,以下代码采用dev-C++平台测试 //pointer to fucntion 函数功能是 基地址加偏移量得到偏移 ...
- 函数指针(pointer to function)——qsort函数应用实例
一,举例应用 在ACM比赛中常使用 stdlib.h 中自带的 qsort 函数,是教科书式的函数指针应用示范. #include <stdio.h> #include <stdli ...
- 指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)
一.指针函数 1.解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数.如: int fun(int x,int y); //这是一个普通函数的声明,返回值是一个int类型, ...
- 野指针(Wild pointer)和悬垂指针(dangling pointer)
详细参考如下: Dangling pointer(悬垂指针.迷途指针)和 Wild pointer(野指针) 迷途指针经常出现在混杂使用malloc() 和 free() 库调用: 当指针指向的内存释 ...
- [C++] the pointer array & the array's pointer
int *p[4]------p是一个指针数组,每一个指向一个int型的int (*q)[4]---------q是一个指针,指向int[4]的数组 --> type: int(*)[4] vo ...
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别
js中有两种声明函数的方法,分别为: var functionOne = function() { // Some code }; function functionTwo() { // Some c ...
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别 (译)
stackOverflow中看到了很久以前问的一个关于函数声明的问题,问题对函数剖析的特别深.这里翻译了一下组织成一篇小博文,加深一下对这两种声明方式的印象.虽是老调重弹,但是只要能帮助理解问题,不管 ...
- JS中var声明与function声明以及构造函数声明方式的区别
JS中常见的三种函数声明(statement)方式有这三种: // 函数表达式(function expression) var h = function () { // h } // 函数声明(fu ...
- Google C++ Style Guide
Background C++ is one of the main development languages used by many of Google's open-source project ...
- .NET软件工程师面试总结
1.手写画出系统架构图,系统代码架构,有什么技术难点? 2.手写画出系统部署图 CDN(一般购买别人的服务器会自动CDN,他们自己配置就OK啦) 3.asp.net 的session怎么实现会话共享 ...
随机推荐
- C#常见算法题目
//冒泡排序 public class bubblesorter { public void sort(int[] list) { ...
- Google Scholar 论文参考文献的自动生成
写论文经常需要写出参考文献,各种格式实在是麻烦的不行啊,在网上看到一个参考文献自动生成的博客,现在转载下来,以备以后自已能用. 主要是使用Google Scholar. Step 1: 打开Googl ...
- vs 字体
看代码看得眼疼不能不说是程序员的恶梦,那么,选择适当的字体也算是对自己的救赎吧.周末闲得无聊,在网上乱逛,搜索了一些资料整理一下给大家分享,仅作记录而已,参考使用: 1.一个编程人员痛苦的选择 一般适 ...
- CentOS7下命令安装火狐浏览器
使用命令安装火狐浏览器,需要切换root(su root)下,执行下面的命令,自动下载所需依赖包,完成安装 yum -y install firefox 然后重启即可
- Android -- 使用主题配置文件,去掉程序启动界面的短暂黑屏
关于黑屏 默认的情况下,程序启动时,会有一个黑屏的时期,原因是,首个activity会加载一些数据,比如初始化列表数据等. 去除步骤 1./res/values/styles.xml 在 Theme ...
- 分治算法——Karastsuba算法
分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...
- 水晶报表WEB方式下不打印的问题
水晶报表版本是10.2.3600.0,是vs2005自带的.功能原来正常,服务器重做后不能打印,但是导出功能正常. 研究的大概情况: 1.水晶报表的web相关代码位于\aspnet_client\sy ...
- 【树莓派】树莓派raspi-config配置
发现有些树莓派盒子,输入的结果和键盘的实际字符有差异,比如输入 | ,结果显示为 ~. 这是因为树莓派的键盘设置问题. 可以通过设置raspi-config进行配置: 第一次使用树莓派的时候需要进行一 ...
- web前端开发文档
- 指定安装应用程序移至SD卡(App2SD)
在2.2发布之后,除了增加Flash Player的支持外,最令人瞩目的莫过于App to Sdcard的支持了.至此之前,android应用程序仅能安装于手机内存,而在“有限”的资源下,至多能安装5 ...