类成员函数与普通的函数的区别:
1.
所属的
作用域不同
,类成员函数标识了所属的类,必须通过对象调用(虽然可以是空指针对象但必须得有)。
2.
类成员函数编译器会默认加上一个隐藏的参数: this指针
。
所以定义类成员函数的指针与普通的函数指针肯定会有所区别:
C++ 提供了三种运算符 ‘
::*
’ 、‘
.*
’、‘
->*
’ 用于定义和使用
类成员函数指针
。
//定义类成员函数指针并初始化,注意: & 和 类名作用域 都不能省略。
void (CTest::*p_fun)() = &CTest::show;
//使用typedef 进行优化
typedef void (CTest::*P_FUN)();
P_FUN p_fun2 = &CTest::show;
CTest tst;
CTest*pTst = new CTest;
(tst.*p_fun2)(); //普通对象通过类成员函数指针调用类成员函数
(pTst->*p_fun2)(); //指针对象通过类成员函数指针调用类成员函数
和普通函数指针定义时的区别:
void (*p_fun)() = show;
void (CTest::*p_fun)() = &CTest::show;
和普通函数指针使用时的区别:
普通对象:
(*p_fun2)();或p_fun2();
CTest tst; (tst.*p_fun2)();
指针对象:
(*p_fun2)();或p_fun2();
CTest* tst = new CTest; (tst->*p_fun2)();