Architektura C++ s důrazem na vývoj .NET prostředí 1.díl Přetěžování

Napsal O webu (») 1. 7. 2008 v kategorii Programování, přečteno: 2050×

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
Štítky: C++/.NET
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel šest a osm