headerphoto

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.