类成员函数指针小结

成员函数指针分为静态成员函数指针和非静态成员函数指针

静态成员函数指针
静态成员函数指针与普通函数指针区别较小,基本等同于普通函数指针。
只需要在赋值时带上类名。

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;
}

版权声明:本文为xp178171640原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。