为什么在这种情况下成员变量改变了,而对象的地址却保持不变?
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();
表示:
- 创建一个新对象(其
Data
将是垃圾)
- 将该对象的值分配给我们的对象
- 没有改变我们对象的地址
- 但是我们现在有了新对象的垃圾
Data
在下面的代码中,我有一个 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();
表示:
- 创建一个新对象(其
Data
将是垃圾) - 将该对象的值分配给我们的对象
- 没有改变我们对象的地址
- 但是我们现在有了新对象的垃圾
Data