Przeciążanie funkcji to technika większości języków wysokiego programowania. Pozwala ona zapisać wiele funkcji pod jedną wspólną nazwą tak, aby funkcja mogła przyjmować argumenty różnego typu i odpowiednio dostosować swoje działanie.
Kilka funkcji może mieć tą samą nazwę pod warunkiem, że różnią się sygnaturą. Do sygnatury funkcji należą:
Należy pamiętać, że do sygnatury nie należy typ wartości zwracanej, ani nazwy argumentów. Oznacza to, że dany zestaw argumentów może zwracać jeden konkretny typ wyniku. Z kolei nazwy argumentów mogą być dowolne.
Jednym z przykładów gdzie przeciążanie funkcji ma zastosowanie jest funkcja Sumuj(). Jak wiadomo jest wiele różnych typów zmiennych, które mogą przechowywać wartości liczbowe. Często się o tym zapomina, ponieważ kompilatory potrafią po cichu przekonwertować odpowiednie typy danych tak, aby były tego samego typu i żadne dane nie zostały utracone.
Jednak nie trzeba polegać na implementacjach wbudowanych w język programowania. Przypuśćmy, że chcemy napisać funkcję Sumuj(), która będzie służyła do dodawania dwóch argumentów typu int lub double. Zakładamy, że wartość rzczywista ma zostać zwrócona tylko, gdy oba argumenty są rzeczywiste ( w pozostałych wynikiem ma być liczba całkowita).
Pierwsze dwie definicja dotyczą pary argumentów takiego samego typu. Tutaj nie ma potrzeby, aby dokonywać dodatkowej konwersji argumentów.
Teraz pozostaje dopisać definicję, gdy argumenty są różnych typów. Tu należy z kolei pamiętać, że para argumentów int×double jest inna niż double×int, więc będzie trzeba napisać dwie definicje.
Z kolei kolejne przeciążanie możemy napisać tak, aby odwoływało się do poprzednio napisanego. Jest to przydatne w sytuacjach, gdy definicja funkcji zawiera bardzo dużo instrukcji.
W celu potwierdzenia poprawności działania warto napisać fragment kodu testującego, który wypisze wyniki
W kodzie zostały zadeklarowane po dwie zmienne typu int oraz double, a program wypisuje wynik dla każdej możliwej pary typów i zostały otrzymane następujące wyniki:
Jak można zauważyć program poprawnie wybiera przeciążenie i tylko dla liczb rzeczywistych double jest zwracana wartość rzeczywista, a w pozostałych przypadkach zostaje ucięta.
Innym zastosowaniem przeciążeniem może być funkcja wczytująca. Otóż jak wiadomo do sygnatury nie należy zwracany typ, więc nie jest możliwe, aby jedno polecenie Wczytaj() zwracało raz tekst, a raz liczbę całkowitą. Istnieje możliwość skorzystania z modyfikatora out argumentu, który pozwoli komputerowi odróżnić co ma zostać wczytane.
Pierwsza definicja funkcji Wczytaj() służy do wczytywania liczb całkowitych.
Druga definicja funkcji posłuży do wczytania z konsoli liczby rzeczywistej. Warto zwrócić uwagę, że obie funkcje nie zwracają nic, ponieważ stosowany jest modyfikator out.
Teraz pozostje sprawdzic poprawność działania obu funkcji poprzez wczytanie dwóch wartości, a następnie ich wypisania. Posłuży do tego następujący kod:
Wynikiem działania programu dla a = 5 i b = 3.14 będzie wypisanie następującej informacji:
Napisz funkcję Sumuj(), która będzie mogła przyjmować dwa lub trzy argument każdy typu int. Wynikiem działania funkcji ma być suma wszystkich podanych argumentów.
Napisz funkcję Suma(), która pozwoli dodać do siebie dwie liczby całkowite z czego jedna jest zapisana jako tekst w zmiennej typu string. W obu przypadkach wynikiem działania funkcji ma być zmienna typu int.
Napisz funkcję Odwróć(), która jeśli wczyta liczbę typu int to zapisze ją wspak. Z kolei dla liczb rzeczywistych typu double zostanie zapisana wspak część całkowita oraz ułamkowa. Przyjmujemy w tym drugim przypadku, że liczba może mieć do trzech miejsc po przecinku.
Oto przykładowe wyniki: