4

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

…指针需要一个地址,但类内部没有“地址”;选择类的成员意味着偏移到该类。在将该偏移量与特定对象的起始地址结合之前,您无法生成实际地址。指向成员的指针的语法要求您在取消引用指向成员的指针的同时选择一个对象。

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

&(objectname.member_variable)

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

4

2 回答 2

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);
}

你会得到输出:

barPtr=0x0
bar2Ptr=0x4
foo={0,42}

如您所见,这两个值都保存了该成员相对于类开头的偏移量。即使您不知道您正在处理哪个对象,也可以计算它们。

但是如果你想取消引用它们,你必须提供一个对象——这就是.*操作员所做的。

于 2011-03-05T09:41:19.500 回答
0

是的,在这种情况下,术语偏移量表示该特定成员与该类的第一个成员(即对象位置)存储在内存中的距离。

结果得到的值是成员 *member_variable* 的内存位置。仅出于可视化目的,如果您想知道以字节为单位的偏移量,您可以执行以下操作:

std::cout << reinterpret_cast<char *>(&(objectname.member_variable)) - reinterpret_cast<char *>(&objectname);
于 2011-03-05T10:27:53.870 回答