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

标签 c++ constructor this

在下面的代码中,我有一个 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

最佳答案

我们创建对象:

A foo;

并设置其Data成员:

foo.Data = 0;

然后,在 ReplaceThis() 中:

*this = A();

意思是:

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

关于c++ - 为什么在这种情况下成员变量改变了,而对象的地址却保持不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805966/

相关文章:

javascript - 在 JavaScript 中更改函数 "this"值

C++:即使使用 "this"关键字,参数声明也会隐藏类成员

java - 静态 c++ 对象中的 JNI 环境指针并连续两次调用采用字符串参数的 java 函数会使 JVM 崩溃

c++ - 当对共享数据的所有引用都被序列化时,为什么函数是线程安全的?

c++ - vera++ 抛出错误 : cannot open profile description for profile default

c++ - 从构造函数调用虚函数

c# - 为什么我们需要静态构造函数?

c++ - std::ofstream 在 DLL 中的行为不同

java - 构造函数是否可以接受由先前参数定义的多个参数?

php - this 在 C++、PHP 和其他语言中的用法