headerphoto

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.


Design downloaded from Free Templates - your source for free web templates