Přetížení funkce

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Přetížení funkce (anglicky function overloading) je v informatice taková metoda zápisu zdrojového kódu programu, kdy je možné definovat více funkcí (metod) se stejným názvem s různými implementacemi. Volání přetížené funkce tak odpovídá kontextu, ze kterého byla volána, takže podle kontextu volání proveden různý kód.

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ů). Přetížení se týká i návratové hodnoty, kdy překladač podle typu požadované návratové hodnoty na levé straně přiřazovacího operátoru (obvykle znak =) vybere odpovídající funkci.

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 polymorfismem, 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é jak ve strukturovaném programování, tak i v objektově orientovaném programování, kde je často používáno pro přetížení konstruktorů.[1]

Příklad přetížení funkce v programovacím jazyce C (různé struktury seznamu 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)/2;
}
 
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í funkce v programovacím jazyce C++ (různé datové typy návratových hodnot):

double get_sqrt(double n){ 
	// tady bude prislusny kod
};
 
Complex get_sqrt(double n){ 
	// tady bude prislusny kod 
};
 
int main(){
 
	Complex compl;
	double real;
	double n;
	if (n >= 0)
		real = get_sqrt(n); // Tady se vola prvni funkce
	else
		compl = get_sqrt(n); // 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átorů[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ěné (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]

  1. a b PROKOP Martin. Pokročilé programování v jazyce C pro chemiky - Reference, přetížení funkcí, operátory [online]. Brno: NCBR, [cit. 2011-05-10]. Dostupné online.  

Související články[editovat | editovat zdroj]