C++中类的成员变量和成员函数的指针该怎么表示呢?我们知道,普通的变量指针和函数指针可以用下面的方式表示。
typedef int (*commonFunc)();
typedef int *commonVar;
上面定义了一个函数指针和一个变量指针,都是int型,函数无参数。对于C++的类成员变量和成员函数,其实也很类似,只是多了一个类的属性,测试代码如下。
#include <iostream>
using namespace std;
typedef int (*commonFunc)();
typedef int *commonVar;
int comFunc(){
return 100;
}
class Test{
public:
Test() {}
Test(int a, int b):m_a(a),m_b(b){}
~Test() {}
int geta(){return m_a;}
int getb(){return m_b;}
public: //用public属性主要是为了下面测试成员变量指针的方便
int m_a;
int m_b;
};
typedef int (Test::*MemberFunc)(); //定义一个成员函数指针类型
typedef int Test::*Member; //定义一个成员变量指针类型
//对比上面定义普通函数指针和普通变量指针,它们的形式很相似,只是多了一个类作用域
int main(){
/**
* 普通函数指针
*/
commonFunc pcommon = &comFunc; //等价于“commonFunc pcommon = comFunc;”,为了和成员函数指针表示形式一致,建议采用加&这种方式
cout << "1 - common function: " << (*pcommon)() << endl; //等价于下面这一行,为了和成员函数指针表示形式一致,建议采用加*这种方式
cout << "2 - common function: " << pcommon() << endl;
/**
* 普通变量指针
*/
int i = 90;
commonVar pi = &i;
cout << "common var i = " << *pi << endl;
/**
* 成员函数指针测试
*/
Test t(1,2);
MemberFunc pa = &Test::geta;
cout << "t.a = " << (t.*pa)() << endl; //“t.”表示绑定到一个对象,因为成员函数默认有一个隐含的this指针
Test* p = new Test(10,11);
cout << "p->a = " << (p->*pa)() << endl;//“p->”表示绑定到一个指针,这个指针也就是成员函数默认的隐含this指针
/**
* 成员变量指针测试
*/
Member pm = &Test::m_a;
cout << "t.a = " << t.*pm << endl;
return 0;
}
成员函数有一个非成员函数不具有的属性-它的类(class)。指向成员函数的指针必须和为其赋值的函数类型匹配,需要满足三方面的要求(普通函数指针只需要满足前两个要求):(1)参数类型和个数;(2)返回类型 ;(3) 它所属的类类型。
函数指针存储函数的地址,可以被用来直接调用那个函数。成员函数指针首先必须被绑定到一个对象或者一个指针上(得到被调用对象的this 指针),然后才能调 用指针所指的成员函数。