Operator overloading allows giving special meanings to operators when used with user-defined types. It is implemented using special member functions called operator functions. Common operators that can be overloaded include arithmetic, relational, and function call operators. Operator overloading enhances the functionality of operators but does not change their syntax, precedence, or associativity. It allows applying operators to user-defined types in a similar way as they are used for built-in types.