Operator overloading allows operators like + and - to be used with user-defined types by defining corresponding operator functions. These functions have a return type and take class objects or references as arguments, and implement the desired operation. Only existing operators can be overloaded, and their basic meaning cannot change. Certain operators like . and :: cannot be overloaded. Overloaded operators follow syntax rules and can be invoked using operator notation.