1. 指向类非静态成员的函数指针
声明: 指向类的成员函数的指针需要在指针前面加上类的类型,格式为:
typedef 返回值 (类名::*指针类型名)(参数列表);
赋值: 需要用类的成员函数地址赋值,格式为:
指针类型名 指针名 = &类名::成员函数名;
注意:赋值时&符号必须要加:不加&编译器会认为是在调用类的成员函数,所以需要给出参数列表,否则会报错;加&编译器才认为是要获取函数指针。
调用: 调用类对象.*; 调用类指针->*,格式为:
类对象: (类对象.*指针名)(参数列表);
类指针: (类指针->*指针名)(参数列表);
代码示例:
#include <string>
#include <iostream>
using namespace std;
class MathCalculation
{
public:
int add(int a,int b) //非静态函数
{
return a + b;
}
};
typedef int (MathCalculation::*FuncCal)(int,int);
int main()
{
FuncCal funAdd = &MathCalculation::add;
MathCalculation * calPtr = new MathCalculation;
int ret1 = (calPtr->*funAdd)(1,2); //指针调用
MathCalculation cal;
int ret2 = (cal.*funAdd)(3,4); //对象调用
cout << "ret1 = " << ret1 << endl;
cout << "ret2 = " << ret2 << endl;
return 0;
}
2. 指向类静态成员的函数指针
类的静态成员函数和普通函数的函数指针的区别在于,他们是不依赖于具体对象的,所有实例化的对象都共享同一个静态成员,所以静态成员也没有this指针的概念。指向类的静态成员的指针就是普通的指针。非static的member function存在this指针,调用时需要传入该对象的地址,成员函数操作的是对象的数据。
#include <string>
#include <iostream>
using namespace std;
class MathCalculation
{
public:
static int add(int a,int b) //静态函数
{
return a + b;
}
};
typedef int (*FuncCal)(int,int);
int main()
{
FuncCal funAdd = &MathCalculation::add;
MathCalculation * calPtr = new MathCalculation;
int ret1 = (*funAdd)(1,2);
int ret2 = funAdd(3,3);
cout << "ret1 = " << ret1 << endl;
cout << "ret2 = " << ret2 << endl;
return 0;
}
综上所述:
- 类的静态成员函数,使用函数指针和普通函数指针无区别
- 类的非静态成员函数,使用函数指针需要加类限制