Why We Can't Be Friends
Overloads of operators should NOT be done with friends. Friends violate privacy principles.
The book uses friends only because the non-friend version is harder to understand.* However, no professional programmer uses friends except perhaps to overload << or >> which can only be done with a friend. The proper way to implement the prototype is not:
friend const Money operator +(const Money& amount1,
const Money& amount2);
but rather is:
const Money operator +(const Money& rhs);
In
the implementation we rely on the fact that every nonstatic member function
has a pointer to the instance of the calling variable and it is called
this
.
So we can write:
const Money operator +(const Money& rhs){
this->cents += rhs.cents;
dollars += rhs.dollars;// note that this-> is implied
an usually left off
...
}
Note that in an operation
such as A + B or A = B the this
pointer represents A.
_______________________________________
*
Addendum: After an email
exchange with Walter Savitch I found that I misunderstood his motivation.
I now understand his reasoning. He maintains that since m1 + 24 is allowed,
24 + m1 should be allowed. Without friends, the former is and the latter is
not.
If the second form is necessary you would have no choice but to use a friend two argument form (as in the case of overloading << where you have no choice but to use a friend because you must return an ostream type).