指向类成员的指针并非指针

class C
{
     public:
     //...
     int a_;
};
int C::*pimC; //一个指针,指向C的一个int成员
C aC;
C *pc = &aC;
pimC = &C::a_;
aC.*pimC = 0;
int b = pc->*pimC;

    将pimC的值设置为&C::a_时,实际上是将pimC设置为a_在C内的偏移量。说得更明白一些,除非a_是静态成员,否者在表达式&C::a_中使用&并不会带来一个地址,而是一个偏移量。注意,这个偏移量适用于类型C的任何对象,换句话说,如果在一个对象内成员a_距离起点的偏移为12字节,那么在任何其他C对象中,a_距离起点的偏移都是12字节。

    给定一个成员在类内的偏移量,为了访问位于那个偏移量的数据成员,我们需要该类的一个对象的地址。这时候就需要. * 和 ->*这两个看上去非同寻常的操作符闪亮登场了。当写下pC->*pimC时,其实是请求将pC的地址加上pimC内的偏移量,为的是访问pC所指向的C对象中适当的数据成员。当写aC.*pimC时,是在请求aC的地址上加上pimC中的偏移量,也是为了访问pC所指向的C对象中适当的数据成员。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值