为什么算子'='不匹配?

why operator '=' can not match?

本文关键字:不匹配 为什么      更新时间:2023-10-16

我经常收到编译错误:

"bObj1"中的"operator="不匹配=余额::运算符+(Balance&)(((Balance&)(&bObj2))'

你能帮我指出原因吗?提前谢谢。

代码:

class Balance
{
public:
    Balance (int b = 0) {balance = b;};
    Balance (Balance &);
    Balance & operator= (Balance &);
    Balance operator+ (Balance &);
    int get() {return balance;};
    void set(int b) {balance = b;};
private:
    int balance;
};
Balance & Balance::operator=(Balance &copy)
{
    balance = copy.get();
    return *this;
}
Balance Balance::operator+ (Balance &rig)
{
    Balance add;
    add.set(this->get() + rig.get());
    return add;
}
int main()
{
    Balance bObj1, bObj2(100);
    bObj1 = bObj2;
    bObj1 = bObj1 + bObj2; // This line cause the error.
    return 0;
}

您的赋值运算符错误。您可以安全地删除它,因为隐式运算符对于您的简单类来说已经足够了。阅读我什么时候需要写一个赋值运算符?了解更多详细信息。

class Balance
{
public:
  Balance (int b = 0) {balance = b;};
  Balance operator+ (const Balance &);
  int get() const {return balance;};
  void set(int b) {balance = b;};
private:
  int balance;
};
Balance Balance::operator+ (const Balance &rig)
{
  Balance add;
  add.set(this->get() + rig.get());
  return add;
}

在使用带有非常量引用的运算符重写时会出现问题。将您的函数更改为const:

Balance & operator= (const Balance &);
Balance operator+ (const Balance &) const;
int get() const { return balance; }

当应用+运算符时,结果是不可变的右值。因为=无法接受rvalue引用(因为它不是常量),所以编译器无法匹配运算符。

在上面,我已经使您的函数对值友好。=运算符将接受一个右值。+运算符也接受右值,并且是const,因为它不修改对象。因为它是const,所以我也将get函数设置为const。