Operator overloading

Operator overloading

In object oriented computer programming, operator overloading—less commonly known as operator ad-hoc polymorphism—is a specific case of polymorphism, where different operators have different implementations depending on their arguments. Operator overloading is generally defined by the language, the programmer, or both.

Operator overloading is claimed to be useful because it allows the developer to program using notation "closer to the target domain"[1] and allows user-defined types a similar level of syntactic support as types built into the language. It can easily be emulated using function calls; for an example, consider the integers a, b, c:

a + b * c

In a language that supports operator overloading, and assuming the '*' operator has higher precedence than '+', this is effectively a more concise way of writing:

add (a, multiply (b,c))

Contents

Examples

In this case, the addition operator is overloaded to allow addition on a user-defined type "Time" (in C++):

Time operator+(const Time& lhs, const Time& rhs) 
{
    Time temp = lhs;
    temp.seconds += lhs.seconds;
    if (temp.seconds >= 60) {
        temp.seconds -= 60;
        temp.minutes++;
    }
    temp.minutes += rhs.minutes;
    if (temp.minutes >= 60) {
        temp.minutes -= 60;
        temp.hours++;
    }
    temp.hours += rhs.hours;
    return temp;
}

Addition is a binary operation, which means it has left and right operands. In C++, the arguments being passed are the operands, and the temp object is the returned value.

The operation could also be defined as a class method, replacing lhs by the hidden this argument; however this forces the left operand to be of type Time and supposes this to be a potentially modifiable lvalue:

Time Time::operator+(const Time& rhs) const 
{
    Time temp = *this;  /* Copy 'this' which is not to be modified */
    temp.seconds += rhs.seconds;
    if (temp.seconds >= 60) {
        temp.seconds -= 60;
        temp.minutes++;
    }
    temp.minutes += rhs.minutes;
    if (temp.minutes >= 60) {
        temp.minutes -= 60;
        temp.hours++;
    }
    temp.hours += rhs.hours;
    return temp;
}

Note that a unary operator defined as a class method would receive no apparent argument (it only works from this):

bool Time::operator!() const 
{
    return ((hours == 0) && (minutes == 0) && (seconds == 0));
}

Criticisms

Operator overloading has often been criticized because it allows programmers to give operators completely different semantics depending on the types of their operands. For example the use of the << in C++'s:

a << 1

shifts the bits in the variable a left by 1 bit if a is of an integer type, but if a is an output stream then the above code will attempt to write a "1" to the stream. Because operator overloading allows the original programmer to change the usual semantics of an operator and to catch any subsequent programmers by surprise, it is usually considered good practice to use operator overloading with care.

The common reply to this criticism is that the same argument applies to function overloading as well. Furthermore, even in the absence of overloading, a programmer can define a function to do something totally different from what would be expected from its name. An issue that remains is that languages such as C++ provide a limited set of operator symbols, thus removing from programmers the option of choosing a more suitable operator symbol for their new operation.

Another, more subtle issue with operators is that certain rules from mathematics can be wrongly expected or unintentionally assumed. For example the commutativity of + (i.e. that a + b == b + a) does not always apply; an example of this occurs when the operands are strings, since + is commonly overloaded to perform a concatenation of strings (i.e. "school" + "bag" yields "schoolbag", which is different from "bag" + "school" yields "bagschool"). A typical counter to this argument comes directly from mathematics: While + is commutative on integers (and in general any real numbers), it is not commutative for other "types" of variable. It can be further noted that + is not even associative on floating point values in practice due to rounding errors. Another example: binary * (multiplication) is commutative for integers but not commutative in case of matrix multiplication.

Catalog

A classification of some common programming languages by whether their operators are overloadable by the programmer and whether the operators are limited to a predefined set.

Operators Not overloadable Overloadable
New definable
Limited set

Timeline of operator overloading

1960s

The ALGOL 68 specification allowed operator overloading.[7]

Extract from the ALGOL 68 language specification (page 177) where the overloaded operators ¬, =, ≠ and abs are defined:

10.2.2. Operations on Boolean Operands
a) op ∨ = (bool a, b) bool:( a | true | b );
b) op ∧ = (bool a, b) bool: ( a | b | false );
c) op ¬ = (bool a) bool: ( a | false | true );
d) op = = (bool a, b) bool:( a∧b ) ∨ ( ¬b∧¬a );
e) op ≠ = (bool a, b) bool: ¬(a=b);
f) op abs = (bool a)int: ( a | 1 | 0 );

Note that no special declaration is required to overload an operator, and the programmer is free to create new operators.

1980s

Ada supports overloading of operators from its inception, with the publication of the Ada 83 language standard. However, the designers of the language choose not to permit the definition of new operators: only the existing operators in the language may be overloaded (by defining new functions with identifiers such as "+", "*", "and" etc.). Subsequent revisions of the language (in 1995 and 2005) maintain the restriction to overloading of existing operators.

C++'s operator overloading is further refined from that of ALGOL 68's.[8]

1990s

Sun chooses not to include operator overloading in the Java language.[9][10]

2001

Microsoft includes operator overloading in C#.

See also

References


Wikimedia Foundation. 2010.

Look at other dictionaries:

  • Operator (programming) — Programming languages generally support a set of operators that are similar to operations in mathematics. A language may contain a fixed number of built in operators (e.g. + * = in C and C++), or it may allow the creation of programmer defined… …   Wikipedia

  • Overloading — See also: Overload The terms overloading and overloaded may refer to: Constructor and function/method overloading, in computer science, a type of polymorphism where different functions with the same name are invoked based on the data types of the …   Wikipedia

  • Operator — Rechenzeichen; arithmetischer Operator; Systemadministrator; Admin (umgangssprachlich); Superuser; Administrator; Systembetreuer; Sysop; Systemoperator; Sysadmin; …   Universal-Lexikon

  • Assignment operator (C++) — In the C++ programming language, the assignment operator, = , is the operator used for assignment. Like most other operators in C++, it can be overloaded. The copy assignment operator, often just called the assignment operator , is a special case …   Wikipedia

  • Assignment operator in C++ — ––The assignment operator in C++ programming language is = . Like other operators in C++, it can be overloaded.The copy assignment operator is a special case of assignment operator used to assign objects of the same class to each other. It is one …   Wikipedia

  • Function overloading — or method overloading is a feature found in various programming languages such as Ada, C#, VB.NET, C++, D and Java that allows the creation of several methods with the same name which differ from each other in terms of the type of the input and… …   Wikipedia

  • Method overloading — is a feature found in various programming languages such as Ada, C#, C++ and Java that allows the creation of several functions with the same name which differ from each other in terms of the type of the input and the type of the output of the… …   Wikipedia

  • Vehicle and Operator Services Agency — (VOSA) is a non departmental public body in the United Kingdom sponsored by the Department for Transport of the United Kingdom Government. The Agency was created from the merger of the Vehicle Inspectorate (VI) and the Traffic Area Network (TAN) …   Wikipedia

  • Oxygene (programming language) — Oxygene Developer RemObjects Software Stable release 3.0.21 (August 29, 2009; 2 years ago (2009 08 29)) Influenced by Object Pas …   Wikipedia

  • C++/CLI — (Common Language Infrastructure) is Microsoft s language specification intended to supersede Managed Extensions for C++. Completely revised to simplify the older Managed C++ syntax (which is now deprecated), it provides much more clarity and code …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”