今天我接受了采访。我被要求编写一个使赋值运算符重载。
假设我有一个 3 个对象,例如
className obj1, obj2, obj3;
现在我想像这样分配
obj1 = obj2 = obj3;
怎么办?
我在下面写了一个程序,但它抛出错误error: no match for ‘operator=’ in ‘ab = ab1.overload::operator=((* & ab2))’
#include <iostream>
using namespace std;
class overload{
public:
int x, y;
overload operator=(overload &);
overload(){x = 1; y = 2;}
};
overload overload::operator=(overload &ov)
{
overload o;
o.x = ov.x;
o.y = ov.y;
cout << o.x << "..." << o.y << endl;
return o;
}
int main()
{
overload ab, ab1, ab2;
ab = ab1 = ab2;
return 0;
}
您正在修改本地对象并按值返回它。您需要修改this
对象并返回对它的引用:
overload& overload::operator=(const overload& ov)
{
this->x = ov.x;
this->y = ov.y;
return *this;
}
您得到的错误是因为函数返回的临时无法绑定到对 non-const 的引用(因此在我的示例中const
)。
问题是您的赋值运算符引用了 non-const 并按值返回。由于从第一个赋值返回的值被视为临时值,因此编译器不会绑定对该赋值的引用,因此第二个赋值会失败。重载赋值运算符的通常形式是:
T &T::operator=(T const &other)
{
...
return *this;
}
您应该使重载运算符返回引用。那么它应该可以工作。
overload& operator=(const overload& o) {
//do my assignment
return *this;
}