The Rational Class sample driver (main), a better version

This sample driver shows how the Rational class is used.

The sample driver file   --   the whole thing: rat2driver.cpp

As with the previous version, the rat2.h file must be included here as well as in the .cpp file. Recall that any identifiers used here, the compiler must know their definitions.

In main, object instantiations are the same:
   Rational w(4), x(7,3), y(3,9), z, copy(x);
Using the default value of one in the constructor, the object   w   will hold the fraction 4/1 in memory. The object   x   will hold 7/3. The object   y   will hold 1/3 after the constructor reduces it to lowest terms. The object   z   will hold 0/1, using both default values in the constructor.

The object   copy   is an exact copy of the object   x  . It uses something called the copy constructor, which always takes an object of the class as its parameter and does a member-wise copy of all the data into the new object being instantiated.

While the code to add looks familiar, x + y, it is actually a function call. The   x + y   is identical to   x.operator+(y). After   x + y   is performed, the assignment is done. Technically, the whole line is   z.operator=(x.operator+(y)). There is also a default   operator=, which also does a member-wise copy of the right operand.
   z = x + y;
   cout << x << " + " << y << " = " << z << endl;
The other arithmetic operators are similar, as are the boolean operators. Inside the cout, the code below is   x.operator>(y):
   cout << x << " is:" << endl;
   cout << ((x > y) ? "    > " : "    not > ");
   cout << y << " according to the overloaded > operator\n";
Test yourself ... what about   x + 5 ... is that legal?
Or, how about   5 + x?

Doing   x + 5   is legal. The compiler views this as   x.operator+(5)   and looks to see if a constructor can construct a Rational object out of 5. Since there is a constructor that can do this, that takes an int parameter, it is called and the integer 5 is cast into the Rational constant 5/1.

On the other hand,   5 + x   gives a compiler error. There is no code for an int to say how to add a Rational to it. To allow   5 + x  , add an operator int() function to the Rational class:
   In class definition: 
      operator int() const;

   Implementation:
      Rational::operator int() {
         return numerator/denominator;
      }
Note that this truncates the value (casts to an int using int division since numerator and denominator are both ints) and crashes if the denominator is zero.

We also get an error for the code   z -= x;    
While we've written the   operator-   and the default   operator=   could be used, we haven't defined the function   operator-=, so a compiler error is generated.