A few rules:
+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete
However, the following cannot be overloaded:
. .* :: ?: sizeof
It is not possible to change the number of operands that an operator takes
It is not possible to create new operators
The meaning of an operator for a built-in type cannot be changed
The functions for (), [], ->, or = MUST be declared as class members. For the other operators, they can be member or non-member functions.
Overloading the + and = operators, does not imply that += has been overloaded.
Two functions must be written to overload ++ (and --), since it can be used as either a post or pre increment (or decrement).
The prefix version is handled as any other prefix operator would be handled:
++object; becomes object.operator++(); //for member functions
operator++(object); //for non-member functions
The postfix version presents a challange because it MUST have a different signature than the prefix version. To accomplish this, the postfix version's header has a dummy integer argument:
object++; becomes object.operator++(0); //for member functions
operator++(object, 0); //for non-member functions
X X::operator++() //pre-increment
{
i++;
return *this;
}
X X::operator++(int) //post-increment
{
X temp = *this; //or X temp( i );
i++; //increment the one pointed to by this pointer
return temp; //but return the non-incremented one
//(where the initial value is saved)
}
In a program:
X d(18);
cout << "Pre-increment:\n"
<< " d is " << d
<< "\n ++d is " << ++d
<< "\n d is " << d;
cout << "\n\nPost-increment:\n"
<< " d is " << d
<< "\n d++ is " << d++
<< "\n d is " << d;
Will produce:
Pre-increment:
d is 18
++d is 19
d is 19
Post-increment:
d is 19
d++ is 19
d is 20