Same operator, different operation
. .* :: ?:
// Overloaded output operator ostream &operator<<(ostream &output, const Date &d) { static char *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 concatenation }
// Preincrement operator overloaded as a member function. Date Date::operator++() { helpIncrement(); return *this; // value return; not a reference return } // Postincrement operator overloaded as a member function. // Note that the dummy integer parameter does not have a // parameter name. Date Date::operator++(int) { Date temp = *this; helpIncrement(); // return non-incremented, saved, temporary object return temp; // value return; not a reference return }
Note: A unary operator can be overloaded as
class String { public: bool operator!() const; ... }; or
class String { public: friend bool operator!( const String & ); ... };
// Add a specific number of days to a date const Date &Date::operator+=(int additionalDays) { for (int i = 1; i <= additionalDays; i++) helpIncrement(); return *this; // enables concatenation }
#include <iostream.h> #include "array1.h" main() { Array integers1(7), integers2; cin >> integers1 >> integers2; // use overloaded inequality (!=) operator cout << "Evaluating: integers1 != integers2" << endl; if (integers1 != integers2) cout << "They are not equal" << endl; // test copy constructor // create array integers3 using integers1 as an initializer Array integers3(integers1); // use overloaded assignment (=) operator integers1 = integers2; // use overloaded equality (==) operator cout << "Evaluating: integers1 == integers2" << endl; if (integers1 == integers2) cout << "They are equal" << endl << endl; // use overloaded subscript operator to create rvalue cout << "integers1[5] is " << integers1[5] << endl; // use overloaded subscript operator to create lvalue integers1[5] = 1000; cout << "integers1: " << integers1 << endl; // attempt to use out of range subscript cout << "Attempt to assign 1000 to integers1[15]" << endl; integers1[15] = 1000; // ERROR: out of range return 0; }implementation for class Array
#include <iostream.h> #include "string1.h" main() { String s1("happy"), s2(" birthday"), s3; // test overloaded equality and relational operators cout << "s2 == s1 yields " << (s2 == s1) << endl << "s2 <= s1 yields " << (s2 <= s1) << endl << endl; // test overloaded String empty (!) operator cout << "Testing !s3:" << endl; if (!s3) { cout << "s3 is empty; assigning s1 to s3;" << endl; s3 = s1; // test overloaded assignment } // test overloaded String concatenation operator cout << "s1 += s2 yields s1 = "; s1 += s2; // test overloaded concatenation cout << s1 << endl << endl; // test conversion constructor cout << "s1 += \" to you\" yields" << endl; s1 += " to you"; // test conversion constructor cout << "s1 = " << s1 << endl << endl; // test overloaded function call operator () for substring cout << "The substring of s1 starting at" << endl << "location 0 for 14 characters, s1(0, 14), is: " << s1(0, 14) << endl << endl; // test substring "to-end-of-String" option cout << "The substring of s1 starting at" << endl << "location 15, s1(15, 0), is: " << s1(15, 0) << endl << endl; // 0 is "to end of string" // test copy constructor String *s4Ptr = new String(s1); cout << "*s4Ptr = " << *s4Ptr << endl << endl; // test assignment (=) operator with self-assignment cout << "assigning *s4Ptr to *s4Ptr" << endl; *s4Ptr = *s4Ptr; // test overloaded assignment cout << "*s4Ptr = " << *s4Ptr << endl; // test destructor delete s4Ptr; // test using subscript operator to create lvalue s1[0] = 'H'; s1[6] = 'B'; cout << endl << "s1 after s1[0] = 'H' and s1[6] = 'B' is: " << s1 << endl << endl; // test subscript out of range cout << "Attempt to assign 'd' to s1[30] yields:" << endl; s1[30] = 'd'; // ERROR: subscript out of range return 0; }implementation for class String
#include <iostream.h> #include "date1.h" main() { Date d1, d2(12, 27, 1992), d3(0, 99, 8045); cout << "d2 += 7 is " << (d2 += 7) << endl << endl; d3.setDate(2, 28, 1992); cout << " d3 is " << d3 << endl; cout << "++d3 is " << ++d3 << endl << endl; Date d4(3, 18, 1969); cout << "Testing the preincrement operator:" << endl << " d4 is " << d4 << endl; cout << "++d4 is " << ++d4 << endl; cout << " d4 is " << d4 << endl << endl; cout << "Testing the postincrement operator:" << endl << " d4 is " << d4 << endl; cout << "d4++ is " << d4++ << endl; cout << " d4 is " << d4 << endl; return 0; }implementation for class Date
Date date1=date2;
return someObject;
String( const String & );the argument must use call-by-reference.
Notes: