析构函数之前可以工作.如何去做

destructor works before . How?

本文关键字:工作 何去做 析构函数      更新时间:2023-10-16
#include<iostream>
using namespace std;
class test
{
int a;
public:
test()
{
    a=0;
}
test operator ++(int)
{        a++;
    return *this;
}
void display()
{
    cout<<a;
}
~test() {
    cout << "DES" << endl;
}
  };
int main()
{
    test t,t1;
    t1 = t++;
    t.display();
    system("pause");
}

我得到的输出是:

DES
1Press any key to continue...
DES 
DES

为什么析构函数之前可以工作?

表达式t++的结果是test类型的临时对象,因为operator++(int)返回值为[*]。在operator=用它赋给t1的新值之后,你看到了这个临时变量的破坏。

[*]通常情况下,这应该包含t的值之前被增加,但在你的实现中,它只是一个对象的副本后增加,你做return *this;创建。所以你的函数体更适合operator++()(前增量)而不是operator++(int)(后增量)。

因为

t1 = t++;

创建一个临时对象,该对象将在表达式(;)结束时销毁。

当您使用t++时,将创建一个临时对象。这就是为2个变量调用3个析构函数的原因。如果使用++t,则不会创建临时对象。除运算符优先级外,这是前递增和后递增的主要区别。

原因是

test operator ++(int)
{
    a++;
    return *this;
}

返回一个临时对象,一旦被立即销毁

t1 = t++;

在调用system()之前执行

operator ++(int)按值返回,而不是按引用返回。创建和销毁临时文件

如果您希望++的行为与内置类型一样,则:

  • 预增量(++t)应该递增,然后返回新值(可以通过引用返回);
  • postincrement (t++)应该复制原始值,并在递增后返回。

你的后增量混合了两者;它增加,然后返回新值的副本,(即像预增量一样,但有一个不必要的副本)。当临时副本在创建它的完整表达式的末尾被销毁时,您将看到额外的析构函数调用。

一个更规范的实现看起来像:

test & operator++() {
    ++a;
    return *this;
}
test operator++(int) {
    test copy = *this;
    ++a;
    return copy;
}