Przeciążanie operatorów
Z Wikipedii
Przeciążanie operatorów (ang. operator overloading, tłumaczone też jako przeładowanie operatorów) to technika występująca w niektórych obiektowych językach programowania polegająca na tym, że można definiować metody mające takie same nazwy i składnię jak predefiniowane operatory.
Wywołania tak przeciążonej metody mogą wyglądać tak:
Z przeciążaniem | Bez przeciążania (przykładowe nazwy) |
---|---|
x + y | x.add( y ) |
x[ y ] | x.get_element_by_index( y ) |
- x | x.negative() |
x << y | x.shift_left( y ) |
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.
[edytuj] Dostępność
Języki umożliwiające przeciążanie i definiowanie nowych operatorów:
Języki umożliwiające przeciążanie operatorów:
Języki bez możliwości przeciążania operatorów:
- C
- Java (chociaż operator + jest przeciążony dla klasy String)
- JavaScript
- Modula-3
- Object Pascal (z wyjątkiem Free Pascala, który dopuszcza przeciążanie operatorów; brak w nim jednak możliwości definiowania nowych)
- Ocaml
- Pascal
- PHP
- Visual Basic