C++类析构函数使用新值而不是实际值

C++ Class Destructor Using New Value Rather Than Actual Value

本文关键字:新值 析构函数 C++      更新时间:2023-10-16

为什么这会在它破坏之前设置值而不是在类的前一个值 (5( 上破坏?

#include <string>
#include <stdio.h>
class TestClass {
public:
int intval = 0;
TestClass(int pos)  {
intval = pos;
}
~TestClass() {
printf("Deleted! %in",intval);
}
};
int main()
{
TestClass a(5);
a = TestClass(234);//should print out "Deleted! 5"
printf("Testn");
}

输出:

Deleted! 234
Test
Deleted! 234

在所示的代码中,您创建了两个对象,这两个对象都是析构的,但时间不同。

首先你有

TestClass a(5);

此对象a将一直存在,直到作用域结束(发生在函数结束时(。这是您看到的第二个输出Deleted! 234

您创建的第二个对象是当您

a = TestClass(234);

这里发生的情况是TestClass(234)创建一个临时对象。这个临时对象用于复制赋值给a,然后临时对象被销毁。此销毁是您看到的第一个输出Deleted! 234


解释一下

a = TestClass(234);

再多一点,它有点大致相当于

{
TestClass temporary_object(234);
a.operator=(temporary_object);
// temporary_object ends its life here and the destructor will be called
}

完整的代码,带有创建和销毁对象的注释

int main()
{
TestClass a(5);  // Create object a
a = TestClass(234);  // Create temporary object, temporary object is destructed
printf("Testn");
// As scope ends, the life-time of object a also ends, and a is destructed
}