以下是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}
如您所见,这两个值都使成员偏离类的开头。即使您不知道在哪个对象上工作,也可以计算它们。
但是,如果要取消引用它们,则必须提供一个对象-
.*
运算符就是这样做的。