C++ examples for Class:Operator Overload
Date class definition with overloaded increment operators.
#include <iostream> #include <string> using namespace std; class Date { // www. j ava 2 s .c om friend ostream &operator<<( ostream &, const Date & ) ; public: Date( int m = 1, int d = 1, int y = 1900 ); // default constructor void setDate( int, int, int ); // set month, day, year Date &operator++(); // prefix increment operator Date operator++( int ); // postfix increment operator const Date &operator+=( int ); // add days, modify object static bool leapYear( int ); // is date in a leap year? bool endOfMonth( int ) const; // is date at the end of month? private: int month; int day; int year; static const int days[]; // array of days per month void helpIncrement(); // utility function for incrementing date }; // initialize static member; one classwide copy const int Date::days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // Date constructor Date::Date( int month, int day, int year ) { setDate( month, day, year ); } // set month, day and year void Date::setDate( int mm, int dd, int yy ) { if ( mm >= 1 && mm <= 12 ) month = mm; else throw invalid_argument( "Month must be 1-12" ); if ( yy >= 1900 && yy <= 2100 ) year = yy; else throw invalid_argument( "Year must be >= 1900 and <= 2100" ); // test for a leap year if ( ( month == 2 && leapYear( year ) && dd >= 1 && dd <= 29 ) || ( dd >= 1 && dd <= days[ month ] ) ) day = dd; else throw invalid_argument( "Day is out of range for current month and year" ); } // overloaded prefix increment operator Date &Date::operator++() { helpIncrement(); // increment date return *this; // reference return to create an lvalue } // overloaded postfix increment operator; note that the // dummy integer parameter does not have a parameter name Date Date::operator++( int ) { Date temp = *this; // hold current state of object helpIncrement(); // return unincremented, saved, temporary object return temp; // value return; not a reference return } // add specified number of days to date const Date &Date::operator+=( int additionalDays ) { for ( int i = 0; i < additionalDays; ++i ) helpIncrement(); return *this; // enables cascading } // if the year is a leap year, return true; otherwise, return false bool Date::leapYear( int testYear ) { if ( testYear % 400 == 0 || ( testYear % 100 != 0 && testYear % 4 == 0 ) ) return true; // a leap year else return false; // not a leap year } // determine whether the day is the last day of the month bool Date::endOfMonth( int testDay ) const { if ( month == 2 && leapYear( year ) ) return testDay == 29; // last day of Feb. in leap year else return testDay == days[ month ]; } // function to help increment the date void Date::helpIncrement() { // day is not end of month if ( !endOfMonth( day ) ) ++day; // increment day else if ( month < 12 ) // day is end of month and month < 12 { ++month; // increment month day = 1; // first day of new month } else // last day of year { ++year; // increment year month = 1; // first month of new year day = 1; // first day of new month } // end else } // overloaded output operator ostream &operator<<( ostream &output, const Date &d ) { static string monthName[ 13 ] = { "", "January" , "February", "March", "April", "May", "June", "July" , "August", "September", "October", "November", "December" }; output << monthName[ d.month ] << ' ' << d.day << ", " << d.year; return output; // enables cascading } int main() { Date d1( 12, 27, 2010 ); // December 27, 2010 Date d2; // defaults to January 1, 1900 cout << "d1 is " << d1 << "\nd2 is " << d2; cout << "\n\nd1 += 7 is " << ( d1 += 7 ); d2.setDate( 2, 28, 2008 ); cout << "\n\n d2 is " << d2; cout << "\n++d2 is " << ++d2 << " (leap year allows 29th)"; Date d3( 7, 13, 2010 ); cout << "\n\nTesting the prefix increment operator:\n" << " d3 is " << d3 << endl; cout << "++d3 is " << ++d3 << endl; cout << " d3 is " << d3; cout << "\n\nTesting the postfix increment operator:\n" << " d3 is " << d3 << endl; cout << "d3++ is " << d3++ << endl; cout << " d3 is " << d3 << endl; }