c++运算符重载,则调用析构函数

c++ operator overloading, destructor is called

本文关键字:调用 析构函数 运算符 重载 c++      更新时间:2023-10-16

我正试图跟踪一个给定类创建了多少对象。如果我重载类中的运算符++,就会调用析构函数,但我不知道为什么。更具体地说:

class num{
public:
    virtual void setValue(int)=0;
    static int db;
    num(){}
    ~num(){}
};
int num::db = 0;
class int32: public num{
public:
    // GET
    int getValue();
    // SET
    void setValue(int f);
    // constructor
    int32()
    {
        cout << "Construction..."<<endl;
        this->value = 0;num::db++;
    }
    // destructor
    ~int32()
    {
        cout << "destruction..."<<endl;
        num::db--;
    }
    // operators
    int32 operator++(int);
    int32 operator++(void);
protected:
    int value;
};
int32 int32::operator ++()
{
    this->value++;
    return *this;
}
int32 int32::operator ++(int)
{
    this->value++;
    return *this;
}
int main()
{
    int32 i;
    i.setValue(20);
    cout << (i++).getValue()<<endl;
    cout << (++i).getValue()<<endl;
    cout << num::db;
    cout << endl << "End of execution.";
    return 1;
}

结果是:建设21摧毁22摧毁-1执行结束。销毁…

所以在++i和i++之后,会调用析构函数,但为什么呢?

非常感谢!

这是因为您返回了一个副本。您可能希望创建一个复制构造函数

您在++运算符中返回对象的副本。

每次调用return *this时,实际上都会创建一个对象的副本,并将其传递给调用代码。

这是因为"operator++()"方法都返回一个"int32"的副本。因此,对于每个调用,都会创建并返回一个新实例。