Operator overloading allows programmers to define special member functions to give class objects behaviors similar to built-in types when operators are used. There are three ways to implement operator overloading functions: member functions, non-member functions, and friend functions. Member functions are called as methods on the object while non-member functions are called independently. Friend functions have access to private members.