重载运算符 = 错误

OVERLOADING OPERATORS = error

本文关键字:错误 运算符 重载      更新时间:2023-10-16

我正在尝试使用重载概念来等同 3 个对象c1c2c3。但它给了我一个错误

error: no match for 'operator=' in 'c3 = c2. circle::operator=(((circle&)(& c1)))'

它背后的原因是什么,我该如何纠正它?

#include<iostream>
using namespace std;
class circle
{
  private:
    int radius;
    float x,y;
  public:
    circle()
    {}
    circle(int rr,float xx,float yy)
    {
      radius=rr;
      x=xx;
      y=yy;
    }
    circle& operator=(const circle& c)
    {
     cout<<endl<<"assignment operator invoked";  
     radius=c.radius;
     x=c.x;
     y=c.y;
     return *this;
     }
    void showdata()
    {
      cout<<endl<<"n radius="<<radius;
      cout<<endl<<"x coordinate="<<x;
      cout<<endl<<"y coordinate="<<y<<endl;
    }
};
int main()
{
  circle c1 (10,2.5,2.5);
  circle c2,c3;
  c3=c2=c1;
  c1.showdata();
  c2.showdata();
  c3.showdata();
  return 0;
} 

所以这个重载运算符将被调用两次。第一个为 c2=c1然后对于 c3=c2,但编译器如何将其与重载运算符定义进行比较?

为了链接operator=调用,必须确保它返回引用

circle& operator=(const circle& c)
{
   cout<<endl<<"assignment operator invoked";  
   radius=c.radius;
   x=c.x;
   y=c.y;
   return *this;
}

c1=c2=c3解析为 c1 = (c2 = c3) 。如果 operator = 不返回引用,则c2 = c3是 rvalue,并且它不能绑定到 c1.operator = 的引用参数(如果参数是对 const 的引用,它可以绑定到 rvalues,但这并不意味着你不应该返回引用(。

另请注意,通过 const 引用获取参数是有意义的,因为您不想更改分配的参数。

还要记住三法则,也就是说,如果您确实需要执行以下任何操作:

  • 过载operator =

  • 显式提供复制构造函数

  • 显式提供析构函数

那么你可能也想做另外两个。在您的特定情况下,您似乎根本不需要超载operator =