Przeciążanie operatorów

Obsługa przeciążania i definiowania nowych operatorów w językach programowania
Przeciążanie i
definiowanie
Przeciążanie Brak
  • Fortran
  • Haskell
  • PostgreSQL
  • Prolog
  • R
  • Smalltalk
  • SML[a]
  • Ada
  • C++
  • C#
  • D
  • Kotlin
  • Object Pascal[1][2]
  • Perl
  • Pico
  • Python
  • Ruby
  • C
  • ECMAScript[b]
  • Java[c]
  • Modula-3
  • Ocaml
  • Pascal
  • PHP[d]
  • Visual Basic

Przeciążanie operatorów (ang. operator overloading) lub przeładowanie operatorów – rodzaj polimorfizmu występującego w niektórych językach programowania, polegający na tym, że operator może mieć różne implementacje w zależności od typów użytych argumentów (operandów).

Przeciążanie operatorów to typowy lukier składniowy. Potencjalnie znacznie poprawia czytelność kodu i umożliwia zdefiniowanie większej części biblioteki standardowej na poziomie języka, bez uciekania się do trików. Z drugiej strony, ta technika programistyczna może spowodować powstawanie niejasnych konstrukcji, gdzie operatory wykonują kompletnie różne czynności w zależności od ich operandów.

Na przykład wyrażenie w C++: a << 1 normalnie oznacza przesunięcie bitowe liczby a w lewo. Jeśli a jest strumieniem, oznacza to przesłanie liczby 1 do tego strumienia. Jak jednak interpretować ten fragment gdy a jest oknem? Z tego powodu zalecane jest, aby przeciążać tylko te operatory, których znaczenia łatwo się domyślić, gdyż mają swój odpowiednik w matematyce, fizyce itp.

Problem nazwy

Inny sposób nazewnictwa – objaśnienia z książki „Symfonia C++ Standard”:

Pisząc w Niemczech tę książkę nie wiedziałem, że pewien polski autor, przetłumaczył termin overloaded – na polski jako przeciążony. […] Warto dodać, że na niemiecki przetłumaczono ten termin jako überladen (przeładować), a nie überlasten (przeciążyć), we francuskim przetłumaczono na recharger (naładować od nowa), na włoski – sovraccaricare, a słowo to nie oznacza wcale czegoś, co jest ciężkie. […] Te fakty potwierdzają słuszność tłumaczenia przeładować.

Jerzy Grębosz, Symfonia C++ Standard[3]

Przeciążanie operatorów we Free Pascalu

W kompilatorze Free Pascal można przeciążać operatory w następujący sposób:

operator +(A, B: TMojaKlasa) R: TMojaKlasa; 
Begin  
// R od Result
 R := (A.Wartosc1 + B.Wartosc1) + (A.Wartosc2 + B.Wartosc2); // Wzięte w nawiasy ze względów estetycznych.
End;

Uwagi

  1. Można deklarować nowe operatory. Nie można przeciążać operatorów. Istnieje kilka domyślnie przeciążonych, ale zdefiniowanie takiej funkcji anuluje przeciążone definicje.
  2. Implementacje ActionScript oraz JavaScript. Rozważane jest wprowadzenie przeciążania w czwartej wersji specyfikacji standardu. ecmascript.org: Class-Defined Operators. [dostęp 2007-09-05]. [zarchiwizowane z tego adresu (2007-09-30)].
  3. Przeciążony jest jedynie operator + dla klasy String.
  4. Standardowa dystrybucja; dostępny jest udostępniający tę możliwość oficjalny moduł. php.net: PECL :: Package :: operator. [dostęp 2007-09-05].

Przypisy

  1. Operator Overloading (Delphi) - RAD Studio [online], docwiki.embarcadero.com [dostęp 2022-01-25] .
  2. Operator overloading - Lazarus wiki [online], wiki.freepascal.org [dostęp 2022-01-25] .
  3. Jerzy Grębosz: Symfonia C++ Standard. Kraków: Edition 2000, 2005.
Kontrola autorytatywna (ad hoc polymorphism):
  • GND: 4531051-8