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

来源:互联网 发布:mac 无线连接显示器 编辑:程序博客网 时间:2024/05/16 12:02

 1、类的成员变量的偏移指针

这是个特殊的指针

[cpp] view plaincopyprint?
  1. class A  
  2. {  
  3. public:  
  4.     int x;  
  5.     int y;  
  6. };  


&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型。

[cpp] view plaincopyprint?
  1. int A::* p;  
  2. p=&A::x;  

语法为:<mem_type> <class_type>::* 

表示为:某类的某个成员类型的偏移指针

 &<class_type>::<mem_name> 为类成员的偏移指针值。

<对象>.*<偏移指针值>和 <对象指针>->*<偏移指针值>:表示为偏移指针应用到对象上后的数据成员的值。

[cpp] view plaincopyprint?
  1. 例如:  
  2. int A::* p1=&A::x;   
  3. A a a.*p1=3;   
  4. A* pA; pA->*p1=4;  
  5.   
  6. int memadd(const A& ca, int A::* a, int A::* b)    
  7. {    
  8.     return ca.*a + ca.*b;    
  9. }    
  10. A a;  
  11. int n = memadd(a, &A::x, &A::y);  

成员变量偏移指针是一种特殊的指针,你无法给它赋予自定义数值。如果给它赋值为NULL,会自动设置为0xFFFFFFFF,如果设置为某个数值,编译无法通过。只能赋值为&A::x这样的编译期常量。

[cpp] view plaincopyprint?
  1. int A::* p;  
  2. p = NULL;  
  3. p = &A::x;  
  4. p = 0x4; //编译出错  

2、类的成员函数指针

假设有类:

[html] view plaincopyprint?
  1. class A  
  2. {  
  3. public:  
  4.     int x;  
  5.   
  6.     int foo(int n)  
  7.     {  
  8.         return n;  
  9.     }  
  10. };  


那么该类的成员函数foo的指针声明如下:

int (A::*)(int)

typedef int(A::* FuncType)(int);

使用方式如下:

[cpp] view plaincopyprint?
  1. A a, *pA=&a;  
  2. FuncType f = &A::foo;  
  3. (a.*f)(3);  
  4. (pA->*f)(3);  

注意:(a.*f)和(pa->*f)别忘记两边的双括号,否则编译不通过。

原创粉丝点击