我正在写一个bignum实现,在其中我重载了运算符+和=。这是我的代码:
BigNum& operator+(const BigNum& b ) {
BigNum sum;
int carry=0;
for (int i=0; i<N;i++){
sum.dig[i]=(dig[i]+b.dig[i]+carry)%10;
carry=(dig[i]+b.dig[i]+carry)/10;
}
return sum;
}
BigNum& operator=(const BigNum& rhs ) {
for (int i=0; i<N; i++){
dig[i]=rhs.dig[i];
}
return *this;
}
他们似乎都在自己身上运作良好(我可以正确地将bignum分配给bignum并正确添加两个bignum)但是当我尝试将它们组合起来时,我得到的答案似乎是随机的。因此,如果a和b是bignums,那么我可以说
BigNum c=b;
和
cout<<a+b;
但
a=a+b;
给出了意想不到的结果。
答案 0 :(得分:1)
您将从sum
运算符返回对局部变量+
的引用。您无法有意义地返回对局部变量的引用或指针。由于此错误,您的代码行为未定义,这是您&#34;意外结果的原因&#34;。
由于您要实现常规二进制文件+
,因此必须按值返回结果
BigNum operator +(const BigNum& b) const {
BigNum sum;
...
return sum;
}
作为补充说明,二进制+
作为独立(可能是朋友)功能更有意义,而不是作为类成员。如果你想把它作为一个类成员,至少要声明它const
(见上文)。
另一个问题是dig
是什么,N
是什么以及您的班级是否违反了三级规则。但是不可能从你发布的内容中说出来。
答案 1 :(得分:0)
这可能无法解答您的问题,但我相信它会改进您的代码,因此,这是一个“建议”。
实现+运算符以创建一个调用+ =运算符的临时表是明智的。
例如:
BigNum& operator += (const BigNum &other) {
int carry = 0;
for (int i = 0; i < digits_length; ++i) {
int temp = digit[i];
digit[i] = (digit[i] + other.digit[i] + carry) % 10;
carry = (temp + other.digit[i] + carry) / 10;
}
return *this;
}
BigNum operator + (const BigNum& other) const {
return BigNum(*this) += other;
}