先来看一个最简单的函数:

void foo(int a)
{
cout << a << endl;
}

它的函数指针类型为

void (*)(int);

我们可以这样使用:

void (*pFunc)(int) = &foo;
pFunc(123);

这就是函数指针的基本使用。

 

类的成员函数

 

那么,对于类的成员函数,函数指针有什么不同呢?

我们观察下面的类:

class Foo
{
public: //void (Foo::*)(int)
void foo(int a)
{
cout << a << endl;
} //void (*)(int)
static void bar(int a)
{
cout << a << endl;
}
};

我们尝试使用:

void (*pFunc)(int) = &Foo::foo;

得到编译错误:

error: cannot convert ‘void (Foo::*)(int)’ to ‘void (*)(int)’ in initialization

从上面的编译错误,我们可以得知,foo的函数指针类型绝对不是我们期望的void (*)(int),而是void (Foo::*)(int)。

原因很简单,类的成员函数,含有一个隐式的参数this,所以foo实际是存在两个参数,Foo*和int。

那么我们尝试使用void (Foo::*)(int)类型,如下:

void (Foo::*pFunc2)(int) = &Foo::foo;

那么如何调用呢,我们采用下列两种方式:

Foo f;
(f.*pFunc2)(45678);

以及

Foo *pf = &f;
(pf->*pFunc2)(7865);

此时的使用方式是正确的。

 

那么bar函数是static函数,它具有什么特点呢?

void (*pFunc)(int) = &Foo::bar;
pFunc(123);

我们发现,static函数和自由函数的指针类型一致。

 

既然foo含有一个隐式参数,那么能否将其转化出来呢?我们使用STL中的mem_fun,这是一种函数适配器。

Foo f;
//void (Foo::*)(int) -> void (*)(Foo*, int)
(mem_fun(&Foo::foo))(&f, 123);

我们可以看到,mem_func起到一种转化作用,将void (Foo::*)(int)类型的成员函数指针转化为void (*)(Foo*, int),后者是一个自由函数类型的指针,可以自由调用。

 

完毕。

类的成员函数指针和mem_fun适配器的用法的更多相关文章

  1. C++ 类的成员函数指针 ( function/bind )

    这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...

  2. VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

    一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...

  3. 获取VB类模块成员函数指针(转)

    最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com ...

  4. 类成员函数指针 ->*语法剖析

    在cocos2d-x中,经常会出现这样的调用,如 ->*,这个是什么意思呢,如下面得这个例子: , 其实这是对类的成员函数指针的调用,在cocos2dx中,这种形式多用于回调函数的调用.如我们经 ...

  5. 成员函数指针与高效C++委托 (delegate)

    下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...

  6. 成员函数指针与高性能C++委托

    1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...

  7. [转]成员函数指针与高性能的C++委托

    原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...

  8. 从汇编看c++成员函数指针(二)

    下面先看一段c++源码: #include <cstdio> using namespace std; class X { public: virtual int get1() { ; } ...

  9. C++ 指向类成员函数指针的用法(转自维基百科)

    类成员函数指针 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息. 目录 1 语法 ...

随机推荐

  1. win8启用.net framework3.5方法

    管理员命令下执行dism.exe /online /enable-feature /featurename:NetFX3 /Source:L:\sources\sxs

  2. centos 7 编译mod_security

    yum install gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel libtoo ...

  3. TMS320F28379D 使用心得之 SCI

    原文地址https://blog.csdn.net/qq_39545674/article/details/82597106 一.SCI 简介SCI(Serial Communication Inte ...

  4. objdump

    objdump -h test (show section headers) test.c #include <stdio.h> int main() { static int xxxxx ...

  5. pymongo.errors.BulkWriteError错误排解

    在mongodb进行数据库操作的时候触发异常   pymongo Error: pymongo.errors.BulkWriteError: batch op errors occurred 这种问题 ...

  6. WCF使用小例子

    using System.Runtime.Serialization; using System.ServiceModel; using MySpace; using System.ServiceMo ...

  7. 使用bottle进行web开发(2):http request

    我们知道,http request有多个方法,比如get,post,delete,patch,put等.对用的,bottle都定义了相应的装饰器,目前定义了五个: get(),post(),put() ...

  8. CONTINUE...?【构造/分析】

    CONTINUE...? Time Limit: 1 Second Memory Limit: 65536 KB Special Judge DreamGrid has classmates numb ...

  9. Python的功能模块[1] -> struct -> struct 在网络编程中的使用

    struct模块 / struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在. ...

  10. STL+Floyd【p1690】贪婪的Copy

    Description Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地.卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1<=Pi&l ...