Przeładowanie funkcji
Dotychczas wiedzieliśmy, że: w danym zakresie ważności może być tylko jedna funkcja o danej nazwie. Kompilator języka C++ daje nam większą swobodę. Przykład: void pisz(float); void pisz(char, int, char); pisz(‘C’, 123, ‘F’); Czy masz wątpliwość o wywołanie jakiej funkcji chodzi?
Przeładowanie funkcji polega na tym, że w danym zakresie ważności jest więcej niż jedna funkcja o takiej samej nazwie. To, która z nich zostaje w danym przypadku uaktywniona zależy od typu argumentów podanych podczas wywołania. Funkcje takie mają tę samą nazwę, ale muszą się różnić liczbą lub typem argumentów. (patrz PROG111.CPP) Przeładowujemy funkcję wówczas, gdy wykonuje ona analogiczną akcję na różnych zestawach obiektów.
void pisz (int x); void pisz (int y);// powtórna deklaracja void pisz (int, char); void pisz (float, char, int); Powtórna deklaracja nie jest błędem. W przypadku deklaracji kompilator nie zareaguje. Zaprotestuje dopiero przy definicjach tych funkcji (patrz PROG112.CPP)
int rysuj (int); float rysuj (int); Przy przeładowaniu ważna jest tylko odmienność argumentów. int rysuj (float, int); int rysuj (int, float); BŁĄD ! POPRAWNIE !
void pisz (float); void pisz (int); void pisz (int, int); void pisz (int, float); pisz (123, (int)45.67); void pisz (int, int); void pisz (int, int); void pisz (int, unsigned int); poprawnie !
Przeładowanie przy argumentach domniemanych void pisz (float); void pisz (char *); void pisz (int, float = 0); pisz (5.67);// pisz (float); pisz (”2000 r.”);// pisz (char *); pisz (123);// pisz (int, float = 0); pisz (123, 5.67);// pisz (int, float); void pisz (int);
W rzeczywistości funkcje przeładowane mają różne nazwy. Kompilator zmienia nazwy wszystkich funkcji programu. Kompilator uzupełnia nazwę funkcji dodając typ argumentów: void rys(void ); void rys (void, float); void rys (float, void ); void rys (void, float, float); rys_Fv rys_Fvf rys _Ffv rys _Fvff Zmiana nazwy funkcji dotyczy zarówno definicji i deklaracji funkcji, jak też i wywołań. Informacja o typie zwracanym nie jest doczepiana do nazwy.