为什么临时对象的地址与C++中具有临时对象的对象地址相同

问题描述

我读了一些关于 C++ 的书,但我无法理解这里的一些要点。 临时对象是由于函数返回而产生的,这个临时对象将存储在某个对象中。 ,所以我在下面尝试了很多时间代码

这样的结果

New: 00CFFB60
copy: 00CFFA60
T: 00CFFA60
copy: 00CFFB54
Destroy: 00CFFA60
temp: 00CFFB54
Destroy: 00CFFB54
Destroy: 00CFFB60

在这里,我理解打印“copy object: 0115FE80”是因为 testfuction 正在返回 T, 所以在我看来,临时对象会出现并用 T 调用复制构造函数,所以临时对象的地址是 00CFFB54(来自 copy: 00CFFB54)。在这代码

我刚刚将这个临时对象输入到 temp

我认为这里曾经发生过复制省略,对吗?

无论如何,在把这个临时对象放到 temp 之后,这个 temp 和 testfunction 的临时对象有相同的地址,结果 temp: 00CFFB54 所以它和之前的 copy: 00CFFB54 完全一样

我无法理解这两个对象如何具有相同的地址。在我看来,这两个不是同一个对象,所以从来没有相同的地址,我尝试了很多次,但总是这两个地址相同。 这里发生了什么?

解决方法

CopyObject 打印出副本的目的地的地址,而不是来源。为 temp = testfunction(a); 显示的地址(根据从 temp 返回的值构造 testfunction)将为 temp

您可以在复制构造函数中显示这两个地址以查看区别。