在课堂结构中,"这个"工作?

时间:2016-10-27 15:02:34

标签: c++ class pointers struct this

如上所述,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.fooa共享相同的地址,如何才能访问this的{​​{1}}指针?

使用foo引发错误:

this->foo

2 个答案:

答案 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();
}