C++类析构函数使用新值而不是实际值
C++ Class Destructor Using New Value Rather Than Actual Value
为什么这会在它破坏之前设置值而不是在类的前一个值 (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
}
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 放置上的析构函数 - 新
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- C++类析构函数使用新值而不是实际值
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 放置新和析构函数
- 是否可以使用类的析构函数内部函数来重置值?
- 迭代器和简单的赋值/析构函数
- Boost 无锁队列断言用于简单的赋值和析构函数
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- 在原始对象上使用惯用(例如 TBB 的 thread_enumerable_specific')移动赋值调用析构函数
- 如何销毁通过"放置新"构造的无析构函数类型
- 为什么在赋值操作完成后调用对象的析构函数
- Clang修改析构函数中的返回值
- 使用shared_ptr时需要实现析构函数、复制构造函数、赋值运算符
- 在析构函数之后打开新的QMainWindow崩溃
- 避免对临时、R 值析构函数进行不必要的分配
- std:map 析构函数是否调用键析构函数以及值析构函数?
- std::map如何调用值析构函数
- Do对象在被赋值给新的析构函数时调用其析构函数