指向Bruce Eckel在C++中思考的成员

use*_*338 4 c++ pointers data-members

以下是Bruce Eckel 在C++中思考(第1卷,第2版,第11章)中标题为"指向成员的指针" 的段落:

...指针需要一个地址,但是类中没有"地址"; 选择类成员意味着抵消该类.您不能生成实际地址,直到将该偏移量与特定对象的起始地址组合.指向成员的指针语法要求您在取消引用指向成员的指针的同时选择一个对象.

这句话是什么意思?我想做的事情如下:

&(objectname.member_variable)
Run Code Online (Sandbox Code Playgroud)

我得到一个实际的地址,比如0x22f14,但是这个偏移量意味着距离起始地址有多远?

Cyg*_*sX1 6

我认为这&(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);
}
Run Code Online (Sandbox Code Playgroud)

你会得到输出:

barPtr=0x0
bar2Ptr=0x4
foo={0,42}
Run Code Online (Sandbox Code Playgroud)

如您所见,两个值都保持成员从类开头的偏移量.即使您不知道您正在使用哪个对象,也可以计算它们.

但是如果你想取消引用它们,你必须提供一个对象 - 这就是.*运算符的作用.