1、类的成员变量的偏移指针
这是个特殊的指针
class A
{
public:
int x;
int y;
};
&A::x和&A::y就表示类A的数据成员偏移指针。
int _tmain(int argc, _TCHAR* argv[])
{
printf("%p\n", &A::x);
printf("%p\n", &A::y);
}
输出:0和4
int A::*是一个类型,表示类A中的成员变量偏移指针,这个指针值类型为int型。
int A::* p;
p=&A::x;
语法为:<mem_type> <class_type>::*
表示为:某类的某个成员类型的偏移指针
&<class_type>::<mem_name> 为类成员的偏移指针值。
<对象>.*<偏移指针值>和 <对象指针>->*<偏移指针值>:表示为偏移指针应用到对象上后的数据成员的值。
例如:
int A::* p1=&A::x;
A a a.*p1=3;
A* pA; pA->*p1=4;
int memadd(const A& ca, int A::* a, int A::* b)
{
return ca.*a + ca.*b;
}
A a;
int n = memadd(a, &A::x, &A::y);
成员变量偏移指针是一种特殊的指针,你无法给它赋予自定义数值。如果给它赋值为NULL,会自动设置为0xFFFFFFFF,如果设置为某个数值,编译无法通过。只能赋值为&A::x这样的编译期常量。
int A::* p;
p = NULL;
p = &A::x;
p = 0x4; //编译出错
2、类的成员函数指针
假设有类:
class A
{
public:
int x;
int foo(int n)
{
return n;
}
};
那么该类的成员函数foo的指针声明如下:
int (A::*)(int)
typedef int(A::* FuncType)(int);
使用方式如下:
A a, *pA=&a;
FuncType f = &A::foo;
(a.*f)(3);
(pA->*f)(3);
注意:(a.*f)和(pa->*f)别忘记两边的双括号,否则编译不通过。