以下是Bruce Eckel的Thinking in C++(第1卷,第2版,第11章)的标题为“指向成员的指针”的段落:



这句话是什么意思?我正在尝试做类似的事情:

&(objectname.member_variable)

我得到了一个实际的地址,类似于0x22f14,但是这个偏移量意味着它离起始地址有多远?

最佳答案

我认为&(foo.bar)只是指向变量的常规指针。说“指向成员的指针”,我们的意思是类似&(FooClass::bar),而无需指定任何对象!注意,该值可以在编译时实际计算,并且可以例如用于在模板中。

成员指针的语法确实很奇怪。

尝试运行以下代码:

#include <stdio.h>

class FooClass {
  public:
    int bar;
    int bar2;
    FooClass() : bar(0), bar2(0) {}
};

int main() {

  //Showing what member pointers actually hold:
  int FooClass::* barPtr=&FooClass::bar;
  int FooClass::* bar2Ptr=&FooClass::bar2;
  printf("barPtr=%p\nbar2Ptr=%p\n",barPtr,bar2Ptr);

  //Showing how to use them:
  FooClass foo;
  foo.*bar2Ptr=42;
  printf("foo={%d,%d}\n",foo.bar,foo.bar2);
}

您将获得输出:
barPtr=0x0
bar2Ptr=0x4
foo={0,42}

如您所见,这两个值都使成员偏离类的开头。即使您不知道在哪个对象上工作,也可以计算它们。

但是,如果要取消引用它们,则必须提供一个对象-.*运算符就是这样做的。

10-07 22:16