如何使赋值运算符重载工作以进行连续赋值

时间:2013-09-19 19:01:44

标签: c++

今天我接受了采访。我被要求编写一个使赋值运算符重载。

假设我有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;
}

3 个答案:

答案 0 :(得分:9)

您正在修改本地对象并按值返回它。您需要修改this对象 并返回对它的引用:

overload& overload::operator=(const overload& ov)
{
    this->x = ov.x;
    this->y = ov.y;
    return *this;
}

您得到的错误是因为函数返回的临时函数无法绑定到对非const的引用(因此在我的示例中为const)。

答案 1 :(得分:3)

问题是你的赋值运算符接受非const的引用并按值返回。由于从第一个赋值返回的值被视为临时值,因此编译器不会绑定对它的引用,因此第二个赋值失败。重载赋值运算符的通常形式是:

T &T::operator=(T const &other)
{
    ...
    return *this;
}

答案 2 :(得分:1)

您应该让重载的运算符返回引用。然后它应该工作。

overload& operator=(const overload& o) {
  //do my assignment
  return *this;
}