If an operator can be overloaded as a nonmember function, define it as a nonmember function to enable implicit type conversions.
C++ can perform certain type conversions automatically. You can define functions to enable conversions.
You can add a Rational object r1 with an integer like this:
r1 + 4
Can you add an integer with a Rational object r1 like this?
4 + r1
Naturally you would think the + operator is symmetric. However, it does not work, because the left operand is the calling object for the + operator and the left operand must be a Rational object. Here, 4 is an integer, not a Rational object. C++ does not perform automatic conversion in this case. To circumvent this problem, take the following two steps:
- Define and implement the following constructor, as discussed in the preceding section.
Rationa1(int numerator);
This constructor enables the integer to be converted to a Rational object.
- Define the + operator as a nonmember function in the Rational.h header file as follows:
Rational operator+(const Rationa1& r1, const Rationa1& r2)
Implement the function in Rational.cpp as follows:
1 Rational operator+(const Rational& r1, const Rational& r2)
2 {
3 return r1.add(r2);
4 }
Automatic type conversion to the user-defined object also works for comparison operators (<, <=, ==, !=, >, >=).
Note that the examples for the operator< and operator+ are defined as member functions in Section 14.3. From now on, we will define them as nonmember functions.
Source: Liang Y. Daniel (2013), Introduction to programming with C++, Pearson; 3rd edition.