gpt4 book ai didi

c++ - Bruce Eckel 的 Thinking in C++ 中指向成员的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:03 25 4
gpt4 key购买 nike

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

…a pointer needs an address, but there is no "address" inside the class; selecting the member of class means offsetting into that class. You cannot produce an actual address untill you combine that offset with the starting address of particular object. The syntax of pointer to member require you select an object at the same time you're dereferencing the pointer to member.

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

&(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}

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

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

关于c++ - Bruce Eckel 的 Thinking in C++ 中指向成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5202878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com