为什么成员变量会发生变化,但在这种情况下,对象的地址是否保持不变?

时间:2015-01-06 19:40:58

标签: c++ constructor this

在下面的代码中,我有一个类A的对象。我使用值0启动其公共成员变量。然后我调用它的方法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

2 个答案:

答案 0 :(得分:6)

我们创建对象:

A foo;

并设置其Data成员:

foo.Data = 0;

然后,在ReplaceThis()

*this = A();

表示:

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

答案 1 :(得分:1)

在本声明中

*this = A(); 

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