成员函数指针分为静态成员函数指针和非静态成员函数指针
静态成员函数指针
静态成员函数指针与普通函数指针区别较小,基本等同于普通函数指针。
只需要在赋值时带上类名。
class Widget
{
public:
static int StaticFunc();
};
using NormalFunc = int(*)();
NormalFunc pNormalFunc = &Widget::StaticFunc; // 赋值需要带上类名
(*pNormalFunc)(); // 和普通函数指针调用方式一样
非静态成员函数指针
非静态成员函数指针与普通函数指针区别较大。
定义需要带上类名。
赋值需要带上类名。
调用需要带上对象或者对象指针。
class Widget
{
public:
int NormalFunc();
};
using MemberFunc = int(Widget::*)(); // 定义需要带上类名
MemberFunc pMemberFunc = &Widget::NormalFunc; // 赋值需要带上类名
Widget one;
(one.*pMemberFunc)(); // 调用需要对象
Widget* pSecond = new Widget; //
(pSecond->pMemberFunc)(); // 调用需要对象指针
好处
使用成员函数指针,可以很方便地调用成员函数。对于静态成员函数,可以作为回调函数使用。
完整例子:
#include <iostream>
#include <string>
class TestClass
{
public:
void NormalFunc1() { std::cout << "Normal Func1..." << std::endl; }
void NormalFunc2() { std::cout << "Normal Func2..." << std::endl; }
void NormalFunc3() { std::cout << "Normal Func3..." << std::endl; }
static void StaticFunc() { std::cout << "Static Func..." << std::endl; }
};
using NormalFuncPtr = void(*)Normal();
using MemberFunPtr = void (TestClass::*)();
void RegisterFunc(FuncPtr pFunc)
{
(*pFunc)();
}
int main()
{
TestClass object;
MemberFunPtr pMemberFunc;
pMemberFunc = &TestClass::NormalFunc1;
(object.*pMemberFunc)();
pMemberFunc = &TestClass::NormalFunc2;
(object.*pMemberFunc)();
pMemberFunc = &TestClass::NormalFunc3;
(object.*pMemberFunc)();
NormalFuncPtr pStaticFunc;
pStaticFunc = &TestClass::StaticFunc;
(*pStaticFunc)();
RegisterFunc(pStaticFunc);
return 0;
}