问题描述
我只知道这样一种,请知道的补充。还请大牛解释一下为什么要加static
class Test{ private:typedef void(*func)(void);func funcPtr[2]; public:Test();~Test();static void func1(void);static void func2(void);};
Test::Test(){ funcPtr[0] = func1; funcPtr[1] = func2}void Test::func1(void) {}void Test::func2(void) {}...
问题解答
回答1:所以这就是为什么stl有std::function。你声明一个function<void(void)>来代替函数指针,那么所有你能想得到的函数指针类型都可以放进去。如果是类成员函数,你还要把this指针给bind进去,然后就可以到处使用了。
不要用裸的函数指针。C语言的函数指针类型在C++里面只能有两个作用:
调用别的C语言编写的dll,你不得不使用函数指针
用来实现std::function
回答2:因为非static的成员函数(例如你的Test类里的func1)的函数原型并不是void (*)()而是 void (Test::*)()对于非static成员函数,函数的“第0个参数”是包含一个Test*类型的指针,就像这样:
void func(Test* this, .../*some arguments*/)
这只是一个比喻,真正的函数签名不是这样的,目的是为了说明你不能把一个成员函数指针强转成一个非成员函数指针,而对于static成员函数,这个this指针是不存在的,所以是可以转换的。
回答3:#include <iostream>#include <stdio.h>using namespace std;class Test{private: typedef void(Test::*foo)(); foo a[2];public: Test(){a[0] = &Test::func1;a[1] = &Test::func2;(this->*a[0])();(this->*a[1])(); } void func1(){printf('func1 %pn', this); } void func2(void){printf('func2 %pn', this); }};int main(){ Test t1; Test t2; return 0;}
static表示类的修饰,用了static之后,方法调用时需要用类的名字空间修饰,但方法本身跟全局方法是等价的。输出func1 0x7ffddf3b3820func2 0x7ffddf3b3820func1 0x7ffddf3b3840func2 0x7ffddf3b3840可见,方法是被绑定在每个对象上的,用static修饰的函数是没有this指针一说的