多项式类赋值(=)运算符重载异常问题求助
解决多项式类赋值运算符重载的异常问题
看起来你遇到的问题很典型——自赋值和乘法赋值时出现系数翻倍,大概率是赋值运算符的实现细节没处理好,或者乘法运算不小心修改了原对象。我来帮你拆解可能的原因和解决办法:
1. 自赋值的处理缺失
当执行P = P时,如果你的赋值运算符没有先判断自赋值,很容易出问题。比如如果你的逻辑是没有清空原对象,直接把rhs的项追加到当前对象后面,那P=P时,原P的项还在,你又把P的项加了一遍,自然系数翻倍。
正确的赋值运算符应该先处理自赋值,再清空当前对象,最后深拷贝:
Polynomial& operator=(const Polynomial& rhs) { // 第一步:拦截自赋值,直接返回 if (this == &rhs) { return *this; } // 第二步:清空当前对象的所有项 Term* temp; while (next != nullptr) { temp = next; next = next->next; delete temp; } next = nullptr; // 别忘了置空头指针 // 第三步:深拷贝rhs的每一项 Term* current = rhs.next; Term* last = nullptr; while (current != nullptr) { Term* newTerm = new Term(); newTerm->coefficient = current->coefficient; newTerm->exponent = current->exponent; newTerm->next = nullptr; if (next == nullptr) { next = newTerm; } else { last->next = newTerm; } last = newTerm; current = current->next; } return *this; }
2. 乘法运算符(operator*)修改了原对象
如果你的operator*不是const成员函数,或者在实现时不小心修改了this或者other的系数,那执行P = Q*P时,Q*P会先修改原P的内容,然后赋值回去,导致系数异常。
正确的乘法运算符应该返回一个新的Polynomial对象,并且是const成员函数,保证不修改原对象:
Polynomial operator*(const Polynomial& other) const { Polynomial result; Term* pCurrent = this->next; while (pCurrent != nullptr) { Term* qCurrent = other.next; while (qCurrent != nullptr) { int newCoeff = pCurrent->coefficient * qCurrent->coefficient; int newExp = pCurrent->exponent + qCurrent->exponent; // 这里要调用合并同类项的方法,而不是直接加新节点 result.mergeTerm(newCoeff, newExp); qCurrent = qCurrent->next; } pCurrent = pCurrent->next; } return result; }
注意这里的mergeTerm方法要检查结果中是否已有相同指数的项,如果有就累加系数,没有才新建节点——如果你的addTerm只是直接加节点,那同类项会重复,但你这里是翻倍,所以更可能是前面的自赋值或赋值时没清空的问题。
3. 辅助函数的潜在问题
比如你的addTerm或者mergeTerm方法是否有逻辑错误?比如在添加项时不小心把原对象的节点共享了(浅拷贝),导致修改时同时影响多个对象?不过这种情况更多是野指针或者重复释放,而不是系数翻倍,但也可以排查一下。
快速排查步骤
- 先给赋值运算符加上自赋值判断,并且确保拷贝前清空了当前对象的所有项;
- 检查
operator*是否是const成员,是否在内部修改了this或other; - 测试
P = P是否正常,如果正常再测试P = Q*P。
内容的提问来源于stack exchange,提问作者Stavros Avramidis
相关产品推荐
相关产品推荐

