首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重载=在bignum实现中

重载=在bignum实现中
EN

Stack Overflow用户
提问于 2015-02-06 11:20:50
回答 2查看 183关注 0票数 0

我正在编写一个bignum实现,并在其中重载了运算符+和=。下面是我的代码:

代码语言:javascript
运行
复制
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是大数,我可以说

代码语言:javascript
运行
复制
BigNum c=b;

代码语言:javascript
运行
复制
cout<<a+b;

代码语言:javascript
运行
复制
a=a+b;

会产生意外的结果。

EN

回答 2

Stack Overflow用户

发布于 2015-02-06 11:22:47

您将从+运算符返回对局部变量sum的引用。您不能有意义地返回指向局部变量的引用或指针。由于这个错误,你的代码的行为是不确定的,这就是你的“意外结果”的原因。

由于您实现的是常规的二进制+,因此必须按值返回结果

代码语言:javascript
运行
复制
BigNum operator +(const BigNum& b) const {
  BigNum sum;
  ...
  return sum;
}

另外,二进制+作为一个独立的(可能是友元)函数更有意义,而不是作为类的成员。如果你想保持它作为类的成员,至少把它声明为const (见上)。

另一个问题是什么是dig,什么是N,以及你的类是否违反了3的规则。但从你发布的内容来看,这是不可能的。

票数 1
EN

Stack Overflow用户

发布于 2015-02-06 12:40:15

这可能没有回答你的问题,但我相信它会改进你的代码,因此,这是一个“建议”。

明智的做法是实现+运算符来创建调用+=运算符的临时运算符。

例如:

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28358044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档