Přetěžování funkcí a operátorů
Přetížení funkcí je nový prvek jazyka C++, tuto vlastnost jazyk C neměl. Jde o možnost definovat více funkcí se stejným jménem. Funkce ale musí být navzájem odlišitelné. Aby překladač mohl jednoznačně určit, kterou funkci použít, vyžaduje odlišnosti v počtu nebo v typech parametrů.
Můžeme například deklarovat tři různé funkce pro určení maximální hodnoty:
// verze funkce max pro typ int int max (int a, int b); // verze funkce max pro typ double double max (double a, double b); // maximum ze tří hodnot double max (double a, double b, double c);
Stejný princip můžeme použít u metod ve třídě, v předchozích kapitolách jsme použili např. přetížení konstruktoru.
PŘETĚŽOVÁNÍ OPERÁTORŮ
V jazyce C není možno měnit chování operátorů, ale v C++ to možné je. Operátory můžeme považovat za speciální funkce, lze je tedy i přetěžovat.
Na příkladu třídy pro zlomky si ukážeme, jak je možno přetížit operátory pro vstup, výstup a operátor pro násobení *. Chceme tedy, abychom mohli tyto operátory použít při práci se zlomky.
// příklad definice třídy pro zlomek class Zlomek{ private: int cit, jmen; public: //konstruktor Zlomek(); Zlomek(int c, int j); //pretizene operatory <<, +, - friend ostream &operator<<(ostream &vystup, Zlomek x); friend istream &operator>>(istream &vstup, Zlomek &x); friend Zlomek operator*(Zlomek x, Zlomek y); };
U přetížení operátorů použijeme při deklaraci ve třídě klíčové slovo friend - tím nastavíme spřátelenou funkci nebo operátor. Umožňuje nám obejít zapouzdření a zpřístupnit soukromá data třídy externím funkcím a třídám. Jde sice o porušení jednoho ze základních pilířů objektového programování, ale někdy se v omezené míře hodí.
Definice přetíženého operátoru pro výstup může vypadat jako v následujícím kódu. Je vhodné ji ještě "zdokonalit" - např. vyřešit zobrazování znaménka a doplnit krácení zlomku před jeho výpisem.
ostream &operator<<(ostream &vystup, Zlomek x) { vystup << x.cit << "/" << x.jmen; return vystup; }
Pro přetížení operátoru >> můžeme pro objekty třídy Zlomek použít následující kód:
istream &operator>>(istream &vstup, Zlomek &x) { cout << endl << "Zadej zlomek :" << endl; cout << " citatel : "; vstup >> x.cit; do { cout << " jmenovatel (nesmi byt 0) : "; vstup >> x.jmen; }while(x.jmen == 0 ); return vstup; }
Definice operátoru * bude potom:
Zlomek operator*(Zlomek x, Zlomek y) //jedná se o klasické násobení 2 zlomků { Zlomek z; z.cit = x.cit * y.cit; z.jmen = x.jmen * y.jmen; return z; }
Poznámka: třídu Zlomek můžeme dále rozšířit o další aritmetické operátory. Při práci se zlomky je vhodné doplnit metodu pro krácení zlomků. Je možné ji nastavit jako soukromou metodu, t.j. lze ji použít jen v metodách třídy.