我正在尝试使用重载概念来等同3个对象c1
,c2
,c3
。
但它给了我一个错误
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,但编译器将如何将其与重载的运算符定义进行比较?
答案 0 :(得分:6)
为了链接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的引用,它可以绑定到右值,但这并不意味着你不应该返回引用)。
另请注意,通过const引用获取参数是有意义的,因为您不想更改您指定的参数。
还要记住the rule of three,也就是说,如果您确实需要执行以下任何操作:
重载operator =
明确提供复制构造函数
明确提供析构函数
operator =
。