我认为这&(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}
如您所见,这两个值都保存了该成员相对于类开头的偏移量。即使您不知道您正在处理哪个对象,也可以计算它们。
但是如果你想取消引用它们,你必须提供一个对象——这就是.*
操作员所做的。