C++运算符重载报错求助:多项式相加赋值异常排查
嘿,作为刚接触运算符重载的新手,遇到这种操作报错真的太正常啦!我来帮你梳理几个最容易踩的语法和语义坑,这些问题经常会导致p4 = p1 + p2这类操作抛出异常:
1. 运算符重载的const修饰缺失
你的加法运算符参数是myPolynomial &obj,但从语义上来说,加法操作不应该修改任何一个输入的多项式对象。正确的函数声明应该给参数和成员函数本身加上const修饰:
// 类内声明 myPolynomial operator+(const myPolynomial &obj) const; // 类外定义 myPolynomial myPolynomial::operator+(const myPolynomial &obj) const { // 你的加法逻辑... }
如果缺少这些const,当操作数是临时对象或者const修饰的多项式对象时,编译器会直接报错;即使编译通过,也可能违背代码的语义规范,埋下隐患。
2. 未实现深拷贝的赋值运算符
你用了p4 = p1 + p2,这里p1+p2会返回一个临时的myPolynomial对象,随后调用赋值运算符完成赋值。因为你的类包含指针成员degreeArray和coeffArray,编译器自动生成的默认赋值运算符是浅拷贝——只会拷贝指针地址,不会复制指针指向的内存内容。这会导致多个对象共享同一块内存,最终触发双重释放的运行时异常。
你需要手动实现深拷贝的赋值运算符:
myPolynomial& myPolynomial::operator=(const myPolynomial &other) { // 先处理自赋值情况 if (this == &other) { return *this; } // 释放当前对象已有的内存 delete[] degreeArray; delete[] coeffArray; // 拷贝对方的数据 terms = other.terms; degreeArray = new float[terms]; coeffArray = new float[terms]; for (int i = 0; i < terms; ++i) { degreeArray[i] = other.degreeArray[i]; coeffArray[i] = other.coeffArray[i]; } return *this; }
同时别忘了实现拷贝构造函数,因为临时对象的构造、函数参数传递等场景都会用到它,同样要遵循深拷贝规则:
myPolynomial::myPolynomial(const myPolynomial &other) { terms = other.terms; degreeArray = new float[terms]; coeffArray = new float[terms]; for (int i = 0; i < terms; ++i) { degreeArray[i] = other.degreeArray[i]; coeffArray[i] = other.coeffArray[i]; } }
3. 默认构造函数的初始化问题
你声明了myPolynomial p4;,这会调用默认构造函数。如果默认构造函数没有正确初始化指针成员,比如把degreeArray和coeffArray设为nullptr,terms设为0,那么后续赋值时释放未初始化的指针会直接触发崩溃。正确的默认构造函数应该是:
myPolynomial::myPolynomial() : degreeArray(nullptr), coeffArray(nullptr), terms(0) {}
4. 加法函数内部的对象构造检查
虽然你说加法逻辑正确,但还是要确认在函数内部构造返回的myPolynomial对象时,有没有正确为degreeArray和coeffArray分配内存,避免出现未分配内存就直接赋值的情况——这会导致非法内存访问的异常。
比如正确的返回对象构造逻辑大概是这样:
myPolynomial myPolynomial::operator+(const myPolynomial &obj) const { myPolynomial result; // 计算合并后的项数、次数和系数... int mergedTerms = ...; // 正确计算得到的合并项数 result.terms = mergedTerms; // 必须先分配内存再填充数据 result.degreeArray = new float[mergedTerms]; result.coeffArray = new float[mergedTerms]; // 填充合并后的次数和系数数据... return result; }
先从这几个点入手排查,应该能解决你遇到的语法或运行时异常问题!
内容的提问来源于stack exchange,提问作者Galaxy6789

