Przeciążanie operatorów
|
|
Zasugerowano, aby zintegrować ten artykuł z artykułem Przeciążanie funkcji. (dyskusja) Nie opisano powodu propozycji integracji. |
| Przeciążanie i definiowanie | Przeciążanie | Brak |
|---|---|---|
Przeciążanie operatorów (ang. operator overloading, przeładowanie operatorów) to 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 [edytuj]
Inny sposób nazewnictwa - objaśnienia z książki "Symfonia C++ Stadard":
"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ć'"
Na podstawie "Symfonia C++ Standard" wyd. z 2005 roku.
Przeciążanie operatorów we Free Pascalu [edytuj]
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;
Przypisy
- ↑ 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.
- ↑ Implementacje ActionScript oraz JavaScript. Rozważane jest wprowadzenie przeciążania w czwartej wersji specyfikacji standardu. ecmascript.org: Class-Defined Operators. [dostęp 5 września 2007].
- ↑ Przeciążony jest jedynie operator + dla klasy String.
- ↑ Wyjątek stanowi Free Pascal.
- ↑ Standardowa dystrybucja; dostępny jest udostępniający tę możliwość oficjalny moduł. php.net: PECL :: Package :: operator. [dostęp 5 września 2007].