Operator overloading is a computer programming language feature that allows a programmer to override a default operator. When the operator function is overloaded, it may be declared with custom arguments that are different data types than what the operator was capable of handling by default. The new parameters may be primitive or user defined types. Within the body of the overriding function, a programmer may manipulate the parameter values as desired. By using operator overloading, a programmer can create intuitive shortcuts for manipulating user defined data types or modify how default data types are handled.
When user defined data types are created, there is no way to do simple operational tasks, such as adding two of them together or incrementing internal data by using the unary increment operator with the data type. Operators, including the addition symbol, can be overridden so that if they are used as a binary operators between two custom data types they return a user defined result. In the same way, an unary operator, like the incrementation operator, might be overridden to increase an internal value within the user defined type.
Once an operator is overloaded, the compiler has to make a decision about what to do when it encounters an overloaded operator. The compiler decides the proper action to take based on what data types are being used as operands, or in conjunction with, the operator. If the operands, which are parameter values to the operator function, are user defined data types, the compiler will choose the overloaded function that has parameters which match the operands being used.
Computer languages vary in how they allow this type of ad-hoc polymorphism. Different languages may allow the creation of new custom operators, the overloading of all or some of its operators, or may not allow operator overloading at all. C++, C#, PHP, and Perl all allow some of their operators to be overloaded. Operator overloading is not allowed in C, Java, and Javascript.
Both operator overloading and function overloading in general have been the subject of some debate. Some claim that giving the programmer the freedom of changing the way an operator behaves could introduce the potential for creating unintentional errors by other programmers who use the customized code. The opposing viewpoint proposes that allowing operator overloading gives programmers the capability of creating intuitive and concise code that will be easier to understand, cost less to produce, and reduce errors.