Přetěžování
Přetížení funkce či operátoru (anglicky function overloading, operator overloading) je v programování taková metoda zápisu zdrojového kódu programu, kdy je možné definovat více funkcí (obslužných metod) se stejnými názvy, zato s různými implementacemi, a to při zachování stejného typu výsledku a i účelu. Volání přetížené metody spustí specifickou implementaci danou kontextem volání.
Přetížení funkce
[editovat | editovat zdroj]Rozhodnutí o tom, která z dostupných funkcí bude volána, provádí překladač podle toho, s jakými parametry je funkce volána (rozhoduje počet a datový typ předaných parametrů).
V přetěžování funkcí je rozhodnutí o volané funkci provedeno již při překladu (tj. staticky). Nezaměňujte proto přetěžování funkcí s přepisováním funkcí (metod), kde se o volání vhodné funkce rozhoduje až za běhu programu pomocí virtuálních funkcí (tj. dynamicky).
Použití
[editovat | editovat zdroj]Přetěžování funkcí je v praxi často používané v objektově orientovaném programování, kde je také používáno pro přetížení konstruktorů.[1]
Příklad přetížení funkce v programovacím jazyce C++ (různé typy a počet parametrů):
double prumer(double n1, double n2){
return (n1+n2)/2;
}
double prumer(int n1, int n2){
return (n1+n2)/2;
}
double prumer(int n1, int n2, int n3){
return (n1+n2+n3)/3;
}
int main(){
double d1, d2, pr;
int i1, i2, i3;
pr = prumer(i1, i2, i3); // Tady se vola treti funkce
pr = prumer(d1, d2); // Tady se vola prvni funkce
pr = prumer(i1, i2); // Tady se vola druha funkce
return 0;
}
Příklad přetížení metod v programovacím jazyce C++:
class Complex{
public:
// Tady bude deklarace konstruktoru, promennych atd.
Complex get_sum(const Complex &c2);
Complex get_sum(double re2);
};
Complex Complex::get_sum(const Complex &c2){
Complex sum;
sum.set(re+c2.get_re(), im+c2.get_im());
return sum;
}
Complex Complex::get_sum(double re2){
Complex sum;
sum.set(re + re2, im);
return sum;
}
int main(){
Complex n1, n2, sum;
double re;
sum = n1.get_sum(n2); // Tady se vola prvni metoda
sum = n1.get_sum(re); // Tady se vola druha metoda
return 0;
}
Přetížení operátoru
[editovat | editovat zdroj]Jazyk C a C++ obsahuje interní definice operátorů pro základní datové typy (int, float, double aj.). C++ umožňuje definovat operátory pro uživatelské typy, tj. pro objektové proměnné (např. chceme-li sečíst dvě struktury typu Matice). Pokud překladač narazí v kódu na znak operátoru, analyzuje datové typy na levé a pravé straně (u binárních operátorů), pokud se jedná o základní datové typy, použije interní zpracování, pokud se jedná o uživatelské typy (tj. objektové typy), hledá operátor, jehož dva parametry odpovídají typově použitým typům.[1]
Příklad přetížení operátoru v programovacím jazyce C++:
Complex operator+(const Complex &c1, const Complex &c2){ //deklarace přetížení operátoru +
Complex sum;
sum.set(c1.get_re() + c2.get_re(), c1.get_im() + c2.get_im());
return sum;
}
int main(){
Complex n1, n2, sum;
sum = n1 + n2; // Tady se zavola operator+
return 0;
}
Reference
[editovat | editovat zdroj]- ↑ a b PROKOP Martin. Pokročilé programování v jazyce C pro chemiky – Reference, přetížení funkcí, operátory [online]. Brno: NCBR, 2011 [cit. 2011-05-10]. Dostupné v archivu pořízeném dne 2011-07-18. – neplatný odkaz !