成员指针是C++中用于对类中成员进行操作。
定义
成员指针的定义格式:成员类型 类名::*指针名=&类名::成员名;
成员函数指针的定义格式: 成员函数返回类型 类名::*指针名 = &类名::成员函数名(参数表);
例:class A
{
public:
int m;
void func(){};
...
};
定义成员指针: int A::*p = &A::m;
定义成员函数指针: void (A::*f)() = &A::func;
主要区别
普通指针用确定对象的地址进行初始化,指向一个确定的对象;成员指针用类的成员(注意不是对象的成员,而是类的成员)初始化(也就是只有
偏移量的信息,而没有初始地址的信息)。
1)在处理一般指针时,可以隐式的将一个指向子类类型的指针转换成一个基类类型的指针,相反则不行。如:
class BASE{
virtual void func();
};
class DERVIED : public BASE{
void func();
};
BASE *bp = new DERVIED; //OK, convert 'DERVIED*' to 'BASE*'
DERVIED *bp = new BASE; //error, can not convert 'BASE*' to 'DERVIED*'
2)对于成员指针,与一般指针刚好相反,一个指向基类的成员指针可以隐式转换成指向子类相应成员指针,相反则不行。如(同样采用上面的两个类):
typedef void (BASE::*BMF)();
typedef void (DERVIED::*DMF)();
BMF bmf1 = &BASE::func; //OK
BMF bmf2 = &DERVIED::func; //error, can not convert 'DERVIED::*' to BMF
DMF dmf1 = &BASE::func; //but this is OK
DMF dmf2 = &DERVIED::func; //OK
由于子类具有基类的所有成员,所以一个子类的成员指针可以指向基类的相应成员,相反,子类可能包含了基类中不存在的成员,所以基类的成员指针不能指向子类成员。