为什么在这种情况下成员变量改变了,而对象的地址却保持不变?

Why does member variable change, but object's address remains the same in this situation?

在下面的代码中,我有一个 class A 的对象。我用 0 的值初始化它的 public 成员变量。然后我调用它的方法 ReplaceThis 来执行命令 *this = A();。然后我打印同一对象的值和地址。该值始终是一些随机的乱码,而地址与之前相同 ReplaceThis。这让我感到困惑,因为未更改的地址表示该对象没有在内存中移动,但是即使 A 的构造函数为空,该值也会变为一些随机数据。

如果有人能逐步解释这段代码中发生了什么,我将不胜感激!

代码:

#include <iostream>

class A
{
public:
    int Data;
    A() {}
    void ReplaceThis() { *this = A(); }
};

int main()
{
    A foo;
    foo.Data = 0;

    std::cout << "Initial  foo data: " << foo.Data << std::endl;
    std::cout << "Initial  foo address: " << &foo << std::endl;

    foo.ReplaceThis();

    std::cout << "Replaced foo data: " << foo.Data << std::endl;
    std::cout << "Replaced foo address: " << &foo << std::endl;
}

输出:

Initial  foo data: 0
Initial  foo address: 0x7fff604594a0
Replaced foo data: 6296256
Replaced foo address: 0x7fff604594a0

在此声明中

*this = A(); 

有调用编译器隐式定义的复制或移动赋值运算符。它只是简单地制作右手对象的成员副本。对象的地址没有改变。

我们创建对象:

A foo;

并设置其 Data 成员:

foo.Data = 0;

然后,在ReplaceThis()

*this = A();

表示:

  1. 创建一个新对象(其 Data 将是垃圾)
  2. 将该对象的值分配给我们的对象
  3. 没有改变我们对象的地址
  4. 但是我们现在有了新对象的垃圾Data