重载=在bignum实现中

时间:2015-02-06 03:20:50

标签: c++

我正在写一个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;

给出了意想不到的结果。

2 个答案:

答案 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;
}