fbpx
Wikipedia

Operator overloading

In computer programming, operator overloading, sometimes termed 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 a programming language, a programmer, or both.

Rationale

Operator overloading is syntactic sugar, and is used because it allows programming using notation nearer to the target domain[1] and allows user-defined types a similar level of syntactic support as types built into a language. It is common, for example, in scientific computing, where it allows computing representations of mathematical objects to be manipulated with the same syntax as on paper.

Operator overloading does not change the expressive power of a language (with functions), as it can be emulated using function calls. For example, consider variables a, b and c of some user-defined type, such as matrices:

a + b * c

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

Add(a, Multiply(b, c))

However, the former syntax reflects common mathematical usage.

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 += rhs.seconds;  temp.minutes += temp.seconds / 60;  temp.seconds %= 60;  temp.minutes += rhs.minutes;  temp.hours += temp.minutes / 60;  temp.minutes %= 60;  temp.hours += rhs.hours;  return temp; } 

Addition is a binary operation, which means it has two 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:

// The "const" right before the opening curly brace means that |this| is not modified. Time Time::operator+(const Time& rhs) const {  Time temp = *this; // |this| should not be modified, so make a copy.  temp.seconds += rhs.seconds;  temp.minutes += temp.seconds / 60;  temp.seconds %= 60;  temp.minutes += rhs.minutes;  temp.hours += temp.minutes / 60;  temp.minutes %= 60;  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; } 

The less-than (<) operator is often overloaded to sort a structure or class:

class Pair {  public:  bool operator<(const Pair& p) const {  if (x_ == p.x_) {  return y_ < p.y_;  }  return x_ < p.x_;  }  private:  int x_;  int y_; }; 

Like with the previous examples, in the last example operator overloading is done within the class. In C++, after overloading the less-than operator (<), standard sorting functions can be used to sort some classes.

Criticisms

Operator overloading has often been criticized[2] because it allows programmers to reassign the semantics of operators depending on the types of their operands. For example, the use of the << operator in C++ a << b shifts the bits in the variable a left by b bits if a and b are of an integer type, but if a is an output stream then the above code will attempt to write a b 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 considered good practice to use operator overloading with care (the creators of Java decided not to use this feature,[3] although not necessarily for this reason).

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. "bird" + "song" yields "birdsong", while "song" + "bird" yields "songbird"). A typical counter[citation needed] to this argument comes directly from mathematics: While + is commutative on integers (and more generally any complex number), it is not commutative for other "types" of variables. In practice, + is not even always associative, for example with floating-point values due to rounding errors. Another example: In mathematics, multiplication is commutative for real and complex numbers but not commutative in matrix multiplication.

Catalog

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

Timeline of operator overloading

1960s

The ALGOL 68 specification allowed operator overloading.[44]

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 needed to overload an operator, and the programmer is free to create new operators. For dyadic operators their priority compared to other operators can be set:

 prio max = 9; op max = (int a, b) int: ( a>b | a | b ); op ++ = (ref int a) int: ( a +:= 1 ); 

1980s

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

In C++, operator overloading is more refined than in ALGOL 68.[45]

1990s

Java language designers at Sun Microsystems chose to omit overloading.[46][47][48]

Python allows operator overloading through the implementation of methods with special names.[49] For example, the addition (+) operator can be overloaded by implementing the method obj.__add__(self, other).

Ruby allows operator overloading as syntactic sugar for simple method calls.

Lua allows operator overloading as syntactic sugar for method calls with the added feature that if the first operand doesn't define that operator, the method for the second operand will be used.

2000s

Microsoft added operator overloading to C# in 2001 and to Visual Basic .NET in 2003.

Scala treats all operators as methods and thus allows operator overloading by proxy.

In Raku, the definition of all operators is delegated to lexical functions, and so, using function definitions, operators can be overloaded or new operators added. For example, the function defined in the Rakudo source for incrementing a Date object with "+" is:

multi infix:<+>(Date:D $d, Int:D $x) { Date.new-from-daycount($d.daycount + $x) } 

Since "multi" was used, the function gets added to the list of multidispatch candidates, and "+" is only overloaded for the case where the type constraints in the function signature are met. While the capacity for overloading includes +, *, >=, the postfix and term i, and so on, it also allows for overloading various brace operators: "[x, y]", "x[ y ]", "x{ y }", and "x( y )".

Kotlin has supported operator overloading since its creation.

See also

References

  1. ^ Stroustrup, Bjarne. . C++ FAQ. Archived from the original on 14 August 2011. Retrieved 27 August 2020.
  2. ^ Fisher, Charles N. (2008). "Issues in Overloading" (PDF). University of Wisconsin–Madison.
  3. ^ "No more operator overloading". The Java Language Environment. Oracle Corporation.
  4. ^ Completely new operators can be added.
  5. ^ Binary functions with a symbolic name can be called infix.
  6. ^ "Predicate op/3".
  7. ^ Hunt, John (6 December 2012). Smalltalk and Object Orientation: An Introduction. Springer Science & Business Media. ISBN 978-1-4471-0961-7.
  8. ^ "Bertrand Meyer: Basic Eiffel language mechanisms". se.ethz.ch. Retrieved 7 April 2021.
  9. ^ "Operator functions in F90". www.mathcs.emory.edu. Retrieved 7 April 2021.
  10. ^ Introduced in Fortran 90.
  11. ^ "3. Language Reference — Futhark 0.19.0 documentation". futhark.readthedocs.io. Retrieved 10 October 2020.
  12. ^ Smith, Chris (9 October 2012). Programming F# 3.0: A Comprehensive Guide for Writing Simple Code to Solve Complex Problems. O'Reilly Media, Inc. ISBN 978-1-4493-2604-3.
  13. ^ Type classes instead of overloading.
  14. ^ "io guide". iolanguage.org. Retrieved 7 April 2021.
  15. ^ "Operators".
  16. ^ "Operators - R in a Nutshell, 2nd Edition [Book]". www.oreilly.com. Retrieved 7 April 2021.
  17. ^ "Creating operators".
  18. ^ "Operators". Tour of Scala.
  19. ^ "Seed7 Manual: Structured syntax definition". seed7.sourceforge.net. Retrieved 29 September 2020.
  20. ^ "Swift: Advanced Operators".
  21. ^ "Why does Go not support overloading of methods and operators?". Retrieved 4 September 2011.
  22. ^ "Introduction". freepascal.org. Retrieved 30 September 2020.
  23. ^ "Operator Overloads". Retrieved 28 September 2018.
  24. ^ "6.6 Overloading of Operators". Annotated Ada Reference Manual.
  25. ^ Drayton, Peter; Albahari, Ben; Neward, Ted (2003). C# in a Nutshell. O'Reilly Media, Inc. ISBN 978-0-596-00526-9.
  26. ^ "C++ Operator Overloading".
  27. ^ "Eclipse Ceylon: Operator Polymorphism". ceylon-lang.org. Retrieved 7 April 2021.
  28. ^ "Operator Overloading - D Programming Language". dlang.org. Retrieved 10 October 2020.
  29. ^ "A tour of the Dart language". dart.dev. Retrieved 30 September 2020.
  30. ^ "Operator Overloading". bourabai.kz. Retrieved 7 April 2021.
  31. ^ "The Apache Groovy programming language - Operators". groovy-lang.org. Retrieved 30 September 2020.
  32. ^ "Operator Overloading". Manifold. Retrieved 7 June 2020.
  33. ^ "Operator overloading". Kotlin. Retrieved 24 June 2018.
  34. ^ "Metamethods Tutorial". Lua-users Wiki.
  35. ^ "Implementing Operators for Your Class". Retrieved 1 October 2013.
  36. ^ "Operator Overloading". Free Pascal Manual. Retrieved 1 December 2014.
  37. ^ "Operator Overloading". Delphi Manual. Retrieved 1 December 2014.
  38. ^ . Archived from the original on 4 March 2016. Retrieved 7 April 2015.
  39. ^ Orwant, Jon (4 November 2002). Computer Science & Perl Programming: Best of The Perl Journal. O'Reilly Media, Inc. pp. 347–. ISBN 978-0-596-00310-4.
  40. ^ "3. Data Model". The Python Language Reference.
  41. ^ "Methods". Official Ruby FAQ.
  42. ^ "Operator Overloading". Rust By Example.
  43. ^ "How to: Define an Operator (Visual Basic)".
  44. ^ =Barry J. Mailloux "Report on the Algorithmic Language ALGOL 68, Section 10.2.2". August 1968. Retrieved 1 April 2007. {{cite web}}: Check |url= value (help)
  45. ^ Stroustrup, Bjarne. "A History of C++: 1979−1991" (PDF). p. 12. Retrieved 1 April 2007.
  46. ^ "FAQ Question 6.9: Why isn't there operator overloading?". The comp.lang.java FAQ List.
  47. ^ . Archived from the original on 7 March 2009. Retrieved 26 March 2009.
  48. ^ Holzner, Steven (2001). C++: Black Book. Scottsdale, Arizona: Coriolis Group. p. 387. ISBN 1-57610-777-9. One of the nicest features of C++ OOP is that you can overload operators to handle objects of your classes (you can't do this in some other OOP-centric languages, like Java).
  49. ^ "3. Data Model, Special method names". The Python Language Reference.

operator, overloading, computer, programming, operator, overloading, sometimes, termed, operator, polymorphism, specific, case, polymorphism, where, different, operators, have, different, implementations, depending, their, arguments, generally, defined, progra. In computer programming operator overloading sometimes termed 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 a programming language a programmer or both Contents 1 Rationale 2 Examples 3 Criticisms 4 Catalog 5 Timeline of operator overloading 5 1 1960s 5 2 1980s 5 3 1990s 5 4 2000s 6 See also 7 ReferencesRationale EditOperator overloading is syntactic sugar and is used because it allows programming using notation nearer to the target domain 1 and allows user defined types a similar level of syntactic support as types built into a language It is common for example in scientific computing where it allows computing representations of mathematical objects to be manipulated with the same syntax as on paper Operator overloading does not change the expressive power of a language with functions as it can be emulated using function calls For example consider variables a b and c of some user defined type such as matrices a b cIn a language that supports operator overloading and with the usual assumption that the operator has higher precedence than the operator this is a concise way of writing Add a Multiply b c However the former syntax reflects common mathematical usage Examples EditIn this case the addition operator is overloaded to allow addition on a user defined type Time in C Time operator const Time amp lhs const Time amp rhs Time temp lhs temp seconds rhs seconds temp minutes temp seconds 60 temp seconds 60 temp minutes rhs minutes temp hours temp minutes 60 temp minutes 60 temp hours rhs hours return temp Addition is a binary operation which means it has two 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 The const right before the opening curly brace means that this is not modified Time Time operator const Time amp rhs const Time temp this this should not be modified so make a copy temp seconds rhs seconds temp minutes temp seconds 60 temp seconds 60 temp minutes rhs minutes temp hours temp minutes 60 temp minutes 60 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 amp amp minutes 0 amp amp seconds 0 The less than lt operator is often overloaded to sort a structure or class class Pair public bool operator lt const Pair amp p const if x p x return y lt p y return x lt p x private int x int y Like with the previous examples in the last example operator overloading is done within the class In C after overloading the less than operator lt standard sorting functions can be used to sort some classes Criticisms EditOperator overloading has often been criticized 2 because it allows programmers to reassign the semantics of operators depending on the types of their operands For example the use of the lt lt operator in C span class n a span span class w span span class o lt lt span span class w span span class n b span span class w span shifts the bits in the variable a left by b bits if a and b are of an integer type but if a is an output stream then the above code will attempt to write a b 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 considered good practice to use operator overloading with care the creators of Java decided not to use this feature 3 although not necessarily for this reason 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 bird song yields birdsong while song bird yields songbird A typical counter citation needed to this argument comes directly from mathematics While is commutative on integers and more generally any complex number it is not commutative for other types of variables In practice is not even always associative for example with floating point values due to rounding errors Another example In mathematics multiplication is commutative for real and complex numbers but not commutative in matrix multiplication Catalog EditA classification of some common programming languages is made according to whether their operators are overloadable by the programmer and whether the operators are limited to a predefined set Operators Not overloadable OverloadableNew definable 4 ML Pico 5 Prolog 6 Smalltalk 7 ALGOL 68 Clojure Eiffel 8 Fortran 9 10 Futhark 11 F 12 Haskell 13 Io 14 Nim 15 R 16 Raku 17 Scala 18 Seed7 19 Swift 20 Limited set BASIC C Go 21 Java JavaScript Modula 2 Objective C Pascal 22 TypeScript 23 Visual Basic Ada 24 C 25 C 26 Ceylon 27 D 28 Dart 29 FreeBASIC 30 Groovy 31 Java 32 Kotlin 33 Lua 34 MATLAB 35 Object Pascal Free Pascal 36 Delphi since 2005 37 PHP using magic methods 38 ArrayAccess interface or Operator extension Perl 39 Python 40 Ruby 41 Rust 42 Visual Basic NET 43 Timeline of operator overloading Edit1960s Edit The ALGOL 68 specification allowed operator overloading 44 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 needed to overload an operator and the programmer is free to create new operators For dyadic operators their priority compared to other operators can be set prio max 9 op max int a b int a gt b a b op ref int a int a 1 1980s Edit Ada supports overloading of operators from its inception with the publication of the Ada 83 language standard However the language designers chose to preclude the definition of new operators Only extant operators in the language may be overloaded by defining new functions with identifiers such as amp etc Subsequent revisions of the language in 1995 and 2005 maintain the restriction to overloading of extant operators In C operator overloading is more refined than in ALGOL 68 45 1990s Edit Java language designers at Sun Microsystems chose to omit overloading 46 47 48 Python allows operator overloading through the implementation of methods with special names 49 For example the addition operator can be overloaded by implementing the method obj add self other Ruby allows operator overloading as syntactic sugar for simple method calls Lua allows operator overloading as syntactic sugar for method calls with the added feature that if the first operand doesn t define that operator the method for the second operand will be used 2000s Edit Microsoft added operator overloading to C in 2001 and to Visual Basic NET in 2003 Scala treats all operators as methods and thus allows operator overloading by proxy In Raku the definition of all operators is delegated to lexical functions and so using function definitions operators can be overloaded or new operators added For example the function defined in the Rakudo source for incrementing a Date object with is multi infix lt gt Date D d Int D x Date new from daycount d daycount x Since multi was used the function gets added to the list of multidispatch candidates and is only overloaded for the case where the type constraints in the function signature are met While the capacity for overloading includes gt the postfix and term i and so on it also allows for overloading various brace operators x y x y x y and x y Kotlin has supported operator overloading since its creation See also EditFunction overloading Polymorphism computer science Subroutine Operator programming Operators in C and C Mutator method Indexer programming Property programming References Edit Stroustrup Bjarne Operator Overloading C FAQ Archived from the original on 14 August 2011 Retrieved 27 August 2020 Fisher Charles N 2008 Issues in Overloading PDF University of Wisconsin Madison No more operator overloading The Java Language Environment Oracle Corporation Completely new operators can be added Binary functions with a symbolic name can be called infix Predicate op 3 Hunt John 6 December 2012 Smalltalk and Object Orientation An Introduction Springer Science amp Business Media ISBN 978 1 4471 0961 7 Bertrand Meyer Basic Eiffel language mechanisms se ethz ch Retrieved 7 April 2021 Operator functions in F90 www mathcs emory edu Retrieved 7 April 2021 Introduced in Fortran 90 3 Language Reference Futhark 0 19 0 documentation futhark readthedocs io Retrieved 10 October 2020 Smith Chris 9 October 2012 Programming F 3 0 A Comprehensive Guide for Writing Simple Code to Solve Complex Problems O Reilly Media Inc ISBN 978 1 4493 2604 3 Type classes instead of overloading io guide iolanguage org Retrieved 7 April 2021 Operators Operators R in a Nutshell 2nd Edition Book www oreilly com Retrieved 7 April 2021 Creating operators Operators Tour of Scala Seed7 Manual Structured syntax definition seed7 sourceforge net Retrieved 29 September 2020 Swift Advanced Operators Why does Go not support overloading of methods and operators Retrieved 4 September 2011 Introduction freepascal org Retrieved 30 September 2020 Operator Overloads Retrieved 28 September 2018 6 6 Overloading of Operators Annotated Ada Reference Manual Drayton Peter Albahari Ben Neward Ted 2003 C in a Nutshell O Reilly Media Inc ISBN 978 0 596 00526 9 C Operator Overloading Eclipse Ceylon Operator Polymorphism ceylon lang org Retrieved 7 April 2021 Operator Overloading D Programming Language dlang org Retrieved 10 October 2020 A tour of the Dart language dart dev Retrieved 30 September 2020 Operator Overloading bourabai kz Retrieved 7 April 2021 The Apache Groovy programming language Operators groovy lang org Retrieved 30 September 2020 Operator Overloading Manifold Retrieved 7 June 2020 Operator overloading Kotlin Retrieved 24 June 2018 Metamethods Tutorial Lua users Wiki Implementing Operators for Your Class Retrieved 1 October 2013 Operator Overloading Free Pascal Manual Retrieved 1 December 2014 Operator Overloading Delphi Manual Retrieved 1 December 2014 PHP magic methods overriding class properties Archived from the original on 4 March 2016 Retrieved 7 April 2015 Orwant Jon 4 November 2002 Computer Science amp Perl Programming Best of The Perl Journal O Reilly Media Inc pp 347 ISBN 978 0 596 00310 4 3 Data Model The Python Language Reference Methods Official Ruby FAQ Operator Overloading Rust By Example How to Define an Operator Visual Basic Barry J Mailloux Report on the Algorithmic Language ALGOL 68 Section 10 2 2 August 1968 Retrieved 1 April 2007 a href Template Cite web html title Template Cite web cite web a Check url value help Stroustrup Bjarne A History of C 1979 1991 PDF p 12 Retrieved 1 April 2007 FAQ Question 6 9 Why isn t there operator overloading The comp lang java FAQ List java sun com Archived from the original on 7 March 2009 Retrieved 26 March 2009 Holzner Steven 2001 C Black Book Scottsdale Arizona Coriolis Group p 387 ISBN 1 57610 777 9 One of the nicest features of C OOP is that you can overload operators to handle objects of your classes you can t do this in some other OOP centric languages like Java 3 Data Model Special method names The Python Language Reference Retrieved from https en wikipedia org w index php title Operator overloading amp oldid 1141493009, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.