【问题标题】:Why does member variable change, but object's address remains the same in this situation?为什么在这种情况下成员变量会改变,但对象的地址保持不变?
【发布时间】:2015-01-06 19:40:58
【问题描述】:

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

【问题讨论】:

    标签: c++ constructor this


    【解决方案1】:

    我们创建对象:

    A foo;
    

    并设置其Data 成员:

    foo.Data = 0;
    

    那么,在ReplaceThis():

    *this = A();
    

    意思是:

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

    【讨论】:

      【解决方案2】:

      在此声明中

      *this = A(); 
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        相关资源
        最近更新 更多