Sobrecàrrega de l'operador
En programació d'ordinadors, la sobrecàrrega d'operadors, de vegades anomenada polimorfisme ad hoc d'operadors, és un cas específic de polimorfisme, on diferents operadors tenen diferents implementacions depenent dels seus arguments. La sobrecàrrega de l'operador es defineix generalment per un llenguatge de programació, un programador o ambdós.
Justificació
modificaLa sobrecàrrega de l'operador és un sucre sintàctic, i s'utilitza perquè permet programar utilitzant una notació més propera al domini objectiu [1] i permet als tipus definits per l'usuari un nivell similar de suport sintàctic que els tipus integrats en un llenguatge. És habitual, per exemple, en la informàtica científica, on permet manipular representacions computacionals d'objectes matemàtics amb la mateixa sintaxi que en el paper.
La sobrecàrrega de l'operador no modifica el poder expressiu d'un llenguatge (amb funcions), ja que es pot emular mitjançant trucades de funcions. Per exemple, considereu les variables a
, b
i c
d'algun tipus definit per l'usuari, com ara les matrius :
a + b * c
En un llenguatge que admet la sobrecàrrega d'operadors, i amb el supòsit habitual que l'operador '*' té una prioritat més alta que l'operador '+', aquesta és una manera concisa d'escriure:
Add(a, Multiply(b, c))
Tanmateix, la sintaxi anterior reflecteix l'ús matemàtic comú.
Exemples
modifica
En aquest cas, l'operador d'addició està sobrecarregat per permetre l'addició en un tipus definit per l'usuari Time
en 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;
}
L'addició és una operació binària, el que significa que té dos operands. En C++, els arguments que es passen són els operands i l'objecte temp
és el valor retornat. L'operació també es podria definir com un mètode de classe, substituint lhs
per l'argument hidden this
; Tanmateix, això obliga l'operand esquerre a ser del tipus 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;
}
Catàleg
modificaEs fa una classificació d'alguns llenguatges de programació comuns segons si els seus operadors són sobrecarregables pel programador i si els operadors estan limitats a un conjunt predefinit.
Operadors | No es pot sobrecarregar | Sobrecàrrega |
---|---|---|
Nou definible | ||
Conjunt limitat |
|
Referències
modifica- ↑ Stroustrup, Bjarne. «Operator Overloading» (en anglès). C++ FAQ. Arxivat de l'original el 14 agost 2011. [Consulta: 27 agost 2020].
- ↑ «Predicate op/3» (en anglès).
- ↑ Hunt, John. Smalltalk and Object Orientation: An Introduction (en anglès). Springer Science & Business Media, 6 desembre 2012. ISBN 978-1-4471-0961-7.
- ↑ «Bertrand Meyer: Basic Eiffel language mechanisms» (en anglès). se.ethz.ch. [Consulta: 7 abril 2021].
- ↑ «Operator functions in F90» (en anglès). www.mathcs.emory.edu. Arxivat de l'original el 2021-08-11. [Consulta: 7 abril 2021].
- ↑ «3. Language Reference — Futhark 0.19.0 documentation» (en anglès). futhark.readthedocs.io. [Consulta: 10 octubre 2020].
- ↑ Smith, Chris. Programming F# 3.0: A Comprehensive Guide for Writing Simple Code to Solve Complex Problems (en anglès). O'Reilly Media, Inc., 9 octubre 2012. ISBN 978-1-4493-2604-3.
- ↑ «io guide» (en anglès). iolanguage.org. [Consulta: 7 abril 2021].
- ↑ «Operators» (en anglès).
- ↑ «Operators - R in a Nutshell, 2nd Edition [Book]» (en anglès). www.oreilly.com. [Consulta: 7 abril 2021].
- ↑ «Creating operators» (en anglès).
- ↑ «Operators» (en anglès). Tour of Scala.
- ↑ «Seed7 Manual: Structured syntax definition» (en anglès). seed7.sourceforge.net. [Consulta: 29 setembre 2020].
- ↑ «Swift: Advanced Operators» (en anglès).
- ↑ «Why does Go not support overloading of methods and operators?» (en anglès). [Consulta: 4 setembre 2011].
- ↑ «Introduction» (en anglès). freepascal.org. [Consulta: 30 setembre 2020].
- ↑ «Operator Overloads» (en anglès). [Consulta: 28 setembre 2018].
- ↑ «6.6 Overloading of Operators» (en anglès). Annotated Ada Reference Manual.
- ↑ Drayton, Peter. C# in a Nutshell (en anglès). O'Reilly Media, Inc., 2003. ISBN 978-0-596-00526-9.
- ↑ «C++ Operator Overloading» (en anglès).
- ↑ «Eclipse Ceylon: Operator Polymorphism» (en anglès). ceylon-lang.org. [Consulta: 7 abril 2021].
- ↑ «Operator Overloading - D Programming Language» (en anglès). dlang.org. [Consulta: 10 octubre 2020].
- ↑ «A tour of the Dart language» (en anglès). dart.dev. [Consulta: 30 setembre 2020].
- ↑ «Operator Overloading» (en anglès). bourabai.kz. Arxivat de l'original el 2020-02-22. [Consulta: 7 abril 2021].
- ↑ «The Apache Groovy programming language - Operators» (en anglès). groovy-lang.org. [Consulta: 30 setembre 2020].
- ↑ «Operator Overloading» (en anglès). Manifold. [Consulta: 7 juny 2020].
- ↑ «Operator overloading» (en anglès). Kotlin. [Consulta: 24 juny 2018].
- ↑ «Metamethods Tutorial» (en anglès). Lua-users Wiki. Arxivat de l'original el 2021-09-16. [Consulta: 22 desembre 2023].
- ↑ «Implementing Operators for Your Class» (en anglès). [Consulta: 1r octubre 2013].
- ↑ «Operator Overloading» (en anglès). Free Pascal Manual. [Consulta: 1r desembre 2014].
- ↑ «Operator Overloading» (en anglès). Delphi Manual. [Consulta: 1r desembre 2014].
- ↑ «PHP magic methods overriding class properties» (en anglès). Arxivat de l'original el 4 març 2016. [Consulta: 7 abril 2015].
- ↑ Orwant, Jon. Computer Science & Perl Programming: Best of The Perl Journal (en anglès). O'Reilly Media, Inc., 4 novembre 2002, p. 347–. ISBN 978-0-596-00310-4.
- ↑ «3. Data Model» (en anglès). The Python Language Reference.
- ↑ «Methods» (en anglès). Official Ruby FAQ.
- ↑ «Operator Overloading» (en anglès). Rust By Example.
- ↑ «How to: Define an Operator (Visual Basic)» (en anglès).