25

As I read in books and in the web, in C++ we can overload the "plus" or "minus" operators with these prototypes (as member functions of a class Money):

const Money operator +(const Money& m2) const;

const Money operator -(const Money& m2) const;

and for the assignment operator with:

const Money& operator =(const Money& m2);

Why use a reference to a Money object as a return value in the assignment operator overloading and not in the plus and minus operators?

2
  • If you returned a reference in a + or - binary operation, what should it refer to? It makes no sense to return a reference. The operation must create a new object. Commented Jan 31, 2014 at 16:43
  • 6
    You don't want to be able to code a + b = c; Commented Jan 31, 2014 at 16:45

6 Answers 6

26

Returning a reference from assignment allows chaining:

a = b = c;  // shorter than the equivalent "b = c; a = b;"

(This would also work (in most cases) if the operator returned a copy of the new value, but that's generally less efficient.)

We can't return a reference from arithmetic operations, since they produce a new value. The only (sensible) way to return a new value is to return it by value.

Returning a constant value, as your example does, prevents move semantics, so don't do that.

Sign up to request clarification or add additional context in comments.

3 Comments

Why? No, assignment chaining had noting to do with what is returned from assignment operator. Assignment chaining (as in your example) is possible in any version. Returning a const reference will prevent multiple modifications to lhs, as in '(a = b) = c', but that's a different story.
In other words, situations that require non-const reference returned from assignment are rather esoteric and generally belong to "bad programming practice" category for which reason one might even see some sources to explicitly recommend returning const reference from assignment.
@AndreyT: You're right, I was confusing myself. (Of course, you have to return something to allow chaining; but it could be a value or constant reference.)
10

Because operator+ and operator- don't act on this object, but return a new object that is the summation (or subtraction) of this object from another.

operator= is different because it's actually assigning something to this object.

operator+= and operator-= would act on this object, and are a closer analog to operator=.

Comments

2

Consider what you are asking. You would want an expression, a + b, to return a reference to one of a or b, which would have the results of the expression. Thus you would modify one of a or b to be the sum of a and b. So you would want to redefine the semantics of the operator (+) to be the same as the operator (+=). And like @manuell said, you would thus allow (a + b) = c. The semantics you are suggesting are already offered by += and -=.

Comments

0

I think its fine if you return by value in overloaded assignment operator , that is because of associativity of assignment operator. consider this:

int a = b =c = 3 ;

here associativity is as followed: (a=(b=(c=3)))

but consider iostream operation cout << x << y << z ;

here associativity is as followed: (((cout << x )<< y) << z) ;

you can see that x will be printed first , so if you return by value in overloading of << operator , return value will not be "lvalue" , while returning by refrence is a lvalue , so cascading of << operator can be achieve.

one more point , copy constructor will get called if you return by value. ( which is not the case with return by refrence)

Comments

0

The link shown below has better explanation I guess return value of operator overloading in C++

Comments

0

Apart from efficiency during chained assignment (e.g., a = b = c;) as pointed out by the accepted answer, it is also a matter of convention. Please, refer Item 10 of Effective C++ by Scott Meyers. It is a convention followed by the built-in types and all the types in the standard library.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.