我正在编写一个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是大数,我可以说
BigNum c=b;和
cout<<a+b;但
a=a+b;会产生意外的结果。
发布于 2015-02-06 11:22:47
您将从+运算符返回对局部变量sum的引用。您不能有意义地返回指向局部变量的引用或指针。由于这个错误,你的代码的行为是不确定的,这就是你的“意外结果”的原因。
由于您实现的是常规的二进制+,因此必须按值返回结果
BigNum operator +(const BigNum& b) const {
BigNum sum;
...
return sum;
}另外,二进制+作为一个独立的(可能是友元)函数更有意义,而不是作为类的成员。如果你想保持它作为类的成员,至少把它声明为const (见上)。
另一个问题是什么是dig,什么是N,以及你的类是否违反了3的规则。但从你发布的内容来看,这是不可能的。
发布于 2015-02-06 12:40:15
这可能没有回答你的问题,但我相信它会改进你的代码,因此,这是一个“建议”。
明智的做法是实现+运算符来创建调用+=运算符的临时运算符。
例如:
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;
}https://stackoverflow.com/questions/28358044
复制相似问题