Přetěžování operátorů - příklad
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 použít tyto operátory při práci s objekty třídy Zlomek.
Třída Zlomek má 2 datové položky: čitatel, jmenovatel. Pro zlomek v základním tvaru jsou obě hodnoty celočíselné. V ukázce jsou uvedeny definice přetížených operátorů.
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.
// 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, const Zlomek &x);
friend istream &operator>>(istream &vstup, Zlomek &x);
friend Zlomek operator*(const Zlomek &x, const Zlomek &y);
};
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, const 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;
}
Ve třídě Zlomek se jedná v podstatě o novou definici (přetížení) běžných operátorů pro použití se zlomky. Např. operátor * umí standardně násobit čísla, my ho "naučíme" násobit zlomky, t.j. vytvoříme vlastní definici chování operátoru * pro naši třídu Zlomek.
Zlomek operator*(const Zlomek &x, const 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.