类成员函数指针
普通成员函数
类被需要的时候会被载入内存,当然类成员函数也会被载入内存,所以类的成员函数是有真正的内存地址的,这个地址一般跟具体的类对象没有什么关系
类成员函数指针,通俗的讲,是一个指针,指向类成员函数
使用方法如下
示例
#include <iostream>
#include <string.h>
using namespace std;
class CT
{
public:
void func(int tmp)
{
cout << "func()普通函数, tmp = " << tmp << endl;
}
virtual void virtualfunc(int tmp)
{
cout << "virtualfunc()虚函数, tmp = " << tmp << endl;
}
static void staticfunc(int tmp)
{
cout << "staticfunc()静态成员函数, tmp = " << tmp << endl;
}
};
int main(void)
{
CT ct;
CT* pct;
pct = &ct;
void(CT:: * func_pointpt)(int); //一个类成员函数指针变量的定义, 变量名为func_pointpt
func_pointpt = &CT::func;
(ct.*func_pointpt)(100); //运算符优先级,这里要加括号
(pct->*func_pointpt)(100);
//类成员函数指针,必须定义类来调用.
return 0;
}
虚成员函数
上述案例中已经有写虚函数的接口,这里可以调用
虚成员函数与普通成员函数是一样的写法
main中
CT ct;
CT* pct;
pct = &ct;
void(CT:: * func_pointpt)(int) = &CT::virtualfunc;
(ct.*func_pointpt)(100);
(pct->*func_pointpt)(100);
请注意,这个地址其实也是一个真正的内存地址,类中一旦有虚函数,就会自动产生一个虚函数表,希函数表里有许多表项,每个表项是一个指针,每个指针指向一个虚函数地址.
用法同样也是要把指针绑定到一个类对象才能调用
静态成员函数
因为静态成员函数是跟着类走的,与具体的对象无关,这表示静态成员函数被看作全局函数,因此并没有用"类名::"这种作用域限定符来限定
void(* func_pointpt)(int) = &CT::staticfunc;
func_pointpt(100);