类的成员变量偏移指针和成员函数指针

 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)别忘记两边的双括号,否则编译不通过。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值