为什么重载运算符不起作用?

Why the overloaded operator doesn't work?

本文关键字:不起作用 运算符 重载 为什么      更新时间:2023-10-16

我正在做一个C++项目,该项目使用存储在LinkedList中的多项式。我想重载重要的运算符,例如 +、-、*、/。当函数返回结果时,我在析构函数方面遇到了一些问题。

 Polynomial& Polynomial::operator+(const Polynomial &p){
    Polynomial  sum = *this;
    if (p.list.isEmpty())
        return *this;
    ListElement *temp = p.list.first;
    while (temp){
        sum.list.addSorted(temp->data);
        temp = temp->next;
    }
    return sum;
}

这个函数工作得很好,但是return sum;调用析构函数,我丢失了数据。多项式类中的析构函数调用 list.purge(); 释放链表中的动态内存。所有的类及其方法都很好。

总的来说,我有:

Polynomial p1,p2,sum;
p1.input();              //here I input data for first pol
p2.input();
sum=p1+p2;               //I overloaded operator=, it works fine

我必须做什么来"停止"析构函数?我想在屏幕上输出多项式sum。谢谢!

最好这样重

载运算符+

Polynomial operator+(const Polynomial& p1, const Polynomial &p2){
    if (p1.list.isEmpty())
        return p2;
    else if (p2.list.isEmpty())
        return p1;
    Polynomial sum = p1;
    ListElement *temp = p2.list.first;
    while (temp){
        sum.list.addSorted(temp->data);
        temp = temp->next;
    }
    return sum;
}

1.让它有两个参数,并使其friendPolynomial

2. 退回object而不是reference

你不应该返回对局部变量的引用!

Polynomial  sum = *this;
...
return sum;

从返回类型中删除&sum存在于堆栈上(也称为自动存储)。当其包含范围退出时,它将被销毁 - 调用该实例的析构函数。不应返回对它的引用;这就像返回对幽灵的引用。

如果您按值返回,则将返回总和的副本,您将没问题。

不要返回对局部变量的引用。在函数作用域内创建的对象在该作用域内生存和死亡。

但是,您可以创建引用对象的变量

,并且该变量的生存期现在与它所引用的对象的生存期相同。

喜欢这个:

Polynomial& Polynomial::operator+(const Polynomial &p){
    Polynomial &sum = *this;
    if (p.list.isEmpty())
        return sum;
    ListElement *temp = p.list.first;
    while (temp){
        sum.list.addSorted(temp->data);
        temp = temp->next;
    }
    return sum;
}