PŘETĚŽOVÁNÍ OPERÁTORŮ
Dalším rozšířením jazyka je možnost přetížit nejen funkce, ale i operátory. To znamená určit jim činnost v závislosti na kontextu. Toto je možné, neboť operátor je v C++ chápan jako funkce s jedním parametrem (unární operátor) nebo se dvěma parametry (binární operátor). Při definici pak jméno rozšiřujeme o klíčové slovo operator
@, kde znak @ nahrazuje přetížený operátor.
Pozor! Nelze však přetížit například operátory ?:, .*, ::, sizeof a . (přístup ke strukturám). U přetížení operátoru ++ a nelze určit zda se jedná o postfixový nebo prefixový přístup.
Hononyma
Programovací jazyk C++ umožňuje přetěžovat operátory, vytvářet homonyma. To znamená různé operace provádět pomocí operátoru se stejným jménem.Rozdělení operátorů z hlediska možnosti přetěžování:
1) ?:, .*, ::, sizeof, . , typeid, dynamic_cast, static_cast, reinterpret_cast a const_cast nelze přetěžovat vůbec
2) ( ) (volání funkce), [ ] (indexy), -> (nepřímý přístup), = a (typ) (přetypování) lze přetěžovat jen jako nestatické metody objektových typů
3) new a delete operátory pro správu paměti Ostatní operátory můžeme přetěžovat jako nestatické metody objektových typů i jako řadové funkce (ty, které nejsou součástí tříd).
Pravidla pro tvorbu přetížení operátorů
U přetěžovaných operátorů zůstává zachována původní priorita, asociativita i arita (počet operandů) standardních operátorů. Z toho vyplývá, že i nově definovaný binární operátor * bude mít přednost, tj. vyšší prioritu než binární operátor +. Jazyk neumožňuje prioritu změnit. Asociativita naproti tomu určuje pořadí provádění shodných operátorů. Například výraz:prom1 + prom2 + prom3
se interpretuje
(prom1 + prom2) + prom3
stejně i u všech nově definovaných binárních operátorů +. Jazyk C++ neumožňuje vytvářet zcela nové operátory. Např. ** (druhá mocnina).
Operátorová funkce musí být členem určité třídy nebo musí mít alespoň jeden parametr, který je instancí třídy.
Příklad:
class A
{
....
public:
A operator++(); //prefixovy operator inkrementace
A operator++(int); //postfixovy operator
inkrementace
A operator&(A); //binarni operator &
A operator&(); //unarni operator &
A operator+(A,A); //chyba! Snaha o ternarni operator
};
Autor: Filip Koval