It's a reference because if it weren't the object would be passed by value, which would involve creating a whole new instance of a potentially huge object.
Operator overloading simply allows you to define the behaviour of existing built-in operators on your class. It's implemented in the form of a method <your class>::operator<relevant operator>, and types are pretty much intuitive — e.g.
Code:
const T T::operator+(const T &rhs);
T& T::operator=(const T &rhs);
T& T::operator!();
bool T::operator==(const T &rhs);
There are (surprisingly for C++) only a couple of ugly hacks and weird gotchas to look out for:
Code:
T& T::operator++(); // this is prefix (++foo)
T& T::operator++(int unusedIntParameter); // this is postfix (foo++)
(applies to -- as well).
Bookmarks