C++/Przeciążanie funkcji
Z Wikibooks, biblioteki wolnych podręczników.
W języku C++ możliwe jest utworzenie kilku różnych funkcji, które posiadają tę samą nazwę. Takie funkcje muszą różnić się od siebie ilością lub typem argumentów. Dzięki temu kompilator będzie wiedział dokładnie, którą funkcję należy wywołać. Takie funkcje nazywamy przeciążonymi (czasem również – przeładowanymi).
Oto przykłady funkcji przeciążonych:
void funkcja(int argument); void funkcja(char* argument); void funkcja(char* argument, char* argument2); // int funkcja(int argument); //niedozwolone, funkcje różnią się tylko zwracanym typem int funkcja(bool argument); //dozwolone
Czasami kompilator może zabronić przeładowania, gdy uzna, że typy argumentów są zbyt podobne. Może tak się dziać na przykład w przypadku, gdy:
- użyjemy typu const T i T,
- użyjemy argumentów domyślnych.
void funkcja(int arg1, int arg2 = 0); void funkcja(int arg1); //to ta sama funkcja, zostanie zgłoszony błąd
Kompilator obsługuje przeciążanie przez dodanie do nazwy każdej z przeciążonych funkcji specjalnego identyfikatora, który związany jest z liczbą i typem argumentów - tak więc po etapie kompilacji wszystkie funkcje mają unikalne nazwy.
[edytuj] Zastosowanie
Przeciążenie funkcji najczęściej stosuje się przy np. potęgowaniu:
int pot(int podstawa, int wykladnik) { int wynik=1; for(int i = 0; i < wykladnik; ++i) wynik=podstawa*wynik; return wynik; } double pot(double podstawa, int wykladnik) // przeładowana funkcja I: zwraca inny typ danych i są inne parametry { int wynik=1; for(int i = 0; i < wykladnik; ++i) wynik=podstawa*wynik; return wynik; } void pot(int & podstawa, int wykladnik) // przeładowana funkcja II: nie zwraca danych tylko modyfikuje podstawę która jest podana przez referencję { int wynik=1; for(int i = 0; i < wykladnik; ++i) wynik=podstawa*wynik; podstawa = wynik; }