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 se překladač mohl rozhodnout, 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ě 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 + a -. Chceme tedy, abychom mohli tyto operátory použít při sčítání a odčítání zlomků.
// 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);
Zlomek operator+(Zlomek x);
Zlomek operator-(Zlomek x);
};
Definice operátorů budou potom následovné:
Zlomek Zlomek::operator+(Zlomek x)
{
Zlomek y;
y.cit = this->cit*x.jmen + x.cit*this->jmen;
y.jmen = this->jmen * x.jmen;
return y;
}
Zlomek Zlomek::operator-(Zlomek x)
{
Zlomek y;
y.cit = this->cit*x.jmen - x.cit*this->jmen;
y.jmen = this->jmen * x.jmen;
return y;
}
U přetížení operátorů << a >> 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 může hodit.
ostream &operator<<(ostream &vystup, Zlomek x)
{
vystup << x.cit << "/" << x.jmen;
}
Definice přetíženého operátoru pro výstup může vypadat jako v předchozím příkladě. Vhodnější je ještě ji "zdokonalit" - doplnit např. krácení zlomku před jeho výpisem.
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 );
}