Operator overloading allows functions to be called when operators are used on user-defined types. It overloads built-in operators like + and - to work on custom classes. This makes code involving classes easier to read and write but does not add new capabilities - everything done with operators can be done with functions. There are limitations to operator overloading like not being able to change precedence or number of arguments. Overloading is useful when it improves readability, such as overloading + for a complex number class. The assignment operator (=) can also be overloaded but the compiler provides a default that does member-wise copying, which is sufficient for simple classes like a complex number class.