您的位置:首页 > 其它

指向类成员变量的指针int A:: * p

2017-05-18 11:26 183 查看

 #include  "stdafx.h"

#include <iostream>

#include <type_traits>

 

using  namespace   std;

 

class  A

{

public :

 double   o; //制造一个偏移量

 int a;

};

class  B: public A

{

public:

 int  b;

};

  

 

int main()



 

 A  a1 ;

 a1.a = 111;

 A  a2;

 a2.a = 222;

 int *p1 = NULL;//普通指针

 p1 = &a1.a;//指向成员变量a的地址

 cout << *p1 << endl;

 int A::*  p2 = NULL;//一个指向类成员变量的指针

 p2 = &A::a;// 注意,a并不是静态成员变量

 cout <<  (int&) ( p2 )<< endl; //p2果然是变量a在类中的偏移量 ,偏移了double的8字节

 cout << a1.*p2 << endl; //注意,用一个具体的对象来寻址的

 cout << a2.*p2 << endl; //注意,用一个具体的对象来寻址的

 /*

 看了上面的例子,很容易理解  ,它是一个偏移量而不是地址,因此必须用这种静态的写法,  这里不能用对象地址的地址来赋值。

 

    取内容:    a1.*p2     或者    pA-> *p2;

    这是"指向类成员变量的指针"的解引用,记住,解引用必须有实际的地址,不同的对象有不同的实际地址,加上各自的偏移量,就是各自成员变量的地址。

 

 */

 B  b1;

 b1.a = 333;

 b1.b = 444;

 int A::*p3 = &B::a;

 //int A::*p4 = &B::b;  //错误,因为A无法知道b

 int B::* p5 = &A::a; //指向父类的

 int B::* p6 = &B::b;

 cout << a1.*p3 << endl; //注意,用一个具体的对象来寻址的

 cout << b1.*p5 << endl; //注意,用一个具体的对象来寻址的

 cout << b1.*p6 << endl; //注意,用一个具体的对象来寻址的

 

 return EXIT_SUCCESS;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: