如上所述,this
指针在类中定义的结构中调用时如何操作?
让我们说我有以下代码:
class A {
public:
struct {
void bar() { std::cout << this << std::endl; }
} foo;
};
int main() {
A a; a.foo.bar();
std::cout << &a << std::endl;
std::cout << &a.foo << std::endl;
}
生成此输出:
0x62fe9f
0x62fe9f
0x62fe9f
a.foo
与a
共享相同的地址,如何才能访问this
的{{1}}指针?
使用foo
引发错误:
this->foo
答案 0 :(得分:6)
如果对象&#34;启动&#34;,地址主要是内存的位置。需要多少补偿成员然后由类定义定义。
所以课程A
&#34;开始&#34;在0x62fe9f
。
在课程A
的开头是成员foo
所以因为前面没有任何内容,所以它也有地址0x62fe9f
等。
将课程更改为
时class A {
public:
int i;
struct {
void bar() { std::cout << this << std::endl; }
} foo;
};
你看到&a.i
和&a
具有相同的地址,而&a.foo
应为&a + sizeof(int)
(注意:它可能超过sizeof(int)
,在其他情况下也有所不同,因为如何设置填充。这只是一个简单的例子。你不应该依赖这在实际代码中)
答案 1 :(得分:3)
可能这个程序的修改版本及其输出将具有启发性。
#include <iostream>
using std::cout;
class A {
public:
int data;
struct {
int data;
void bar()
{
cout << this << '\n';
cout << &this->data << '\n';
}
} foo;
void bar()
{
cout << this << '\n';
cout << &this->data << '\n';
cout << &this->foo << '\n';
}
};
int main(void)
{
A a;
cout << &a << '\n';
a.bar();
a.foo.bar();
}