Shrey
Shrey

Reputation: 53

Overloading assignment operator

We can overload assignment operator as a normal function, but we cannot overload assignment operator as a friend function. Why?

Upvotes: 1

Views: 2628

Answers (4)

Luc Bloom
Luc Bloom

Reputation: 1253

You cannot "extend" the assignment operator with a "free function" outside the class, but you can design the class so it will allow it:

Data.h

class Data {
public:
    Data& operator=(const Data& lhs) { /*...*/; return *this; }
    template <typename T> Data& operator=(const T& lhs) {
        return assign(*this, lhs); // Magic right here...
    }
private:
    // ...
};

Point.h

class Point {
public:
    float x,y;
    Point& operator=(const Point& lhs) { x = lhs.x, y = lhs.y; return *this; }
    template <typename T> Point& operator=(const T& lhs) {
        return assign(*this, lhs); // Magic right here...
    }
};

Assignment.h

Data& assign(const Data& lhs, const Point& rhs) {
    lhs["x"] = rhs.x;
    lhs["y"] = rhs.y;
    return lhs;
}

Point& assign(const Point& lhs, const Data& rhs) {
    rhs.query("x", lhs.x) || rhs.query(0, lhs.x);
    rhs.query("y", lhs.y) || rhs.query(1, lhs.y);
    return lhs;
}

Upvotes: 0

haberdar
haberdar

Reputation: 511

The difference between overloading by friend function and overloading by member function is that the calling object must be the first operand in overloading by member function, while there is no restriction in overloading by friend function. This is the reason behind the standard. Similarly, some other operators requiring the first operand to be the calling function must be overloaded using member functions (examples: =, [], ->, and ( )).

Upvotes: 0

Lindydancer
Lindydancer

Reputation: 26164

If you would like to write:

MyClassObject = MyFriendObject;

Then you would want to implement a constructor that takes a const reference to the friend class as it's parameter.

Upvotes: 0

Mikael Persson
Mikael Persson

Reputation: 18572

Because the C++ Standard says so, Article 13.5.3/1:

An assignment operator shall be implemented by a non-static member function with exactly one parameter. Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user (12.8), a base class assignment operator is always hidden by the copy assignment operator of the derived class.

That's all you really need to know. A friend function is not a member function, so it cannot be used to overload the assignment operator.

Upvotes: 4

Related Questions