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

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对象中适当的数据成员。


你可能感兴趣的:(指向类成员的指针并非指针)