Preťažovanie funkcií
Čo to je preťažovanie funkcií
Preťažovanie funkcií Function Overloading spočíva v tom, že môžem jednej a tej istej funkcii nastaviť aby sa správala v závislosti na tom, aké sú jej argumenty. Toto sa dá rozlišovať jednak podľa typu argumentov, a jednak podľa ich počtu. Najjednoduchším príkladom je funkcia absolútnej hodnoty. Ak vstúpi do funkcie celé číslo, vracia funkcia celé kladné číslo, ak vstúpi desatinné číslo funkcia vráti kladné desatinné číslo.#include "stdio.h" int AbsValue (int a){ return( a>0?a:(-a));} double AbsValue (double a){ return( a>0?a:(-a));} int main(int argc, char* argv[]) { printf("\n%d ",AbsValue (2)); printf("\n%d ",AbsValue (-4)); printf("\n%f ",AbsValue (3.5)); printf("\n%f ",AbsValue (-4.5)); //chybne vypisy printf("\n%d ",AbsValue (2.4)); printf("\n%d ",AbsValue (-4.4)); printf("\n%f ",AbsValue (2)); printf("\n%f ",AbsValue (-4)); char pause=getchar(); return 0; }Teraz sa funkcia správa podľa toho, čo do nej vstupuje... (aj keď toto nie je najšťastnejší príklad, lebo obe robia to isté :) Je treba si trochu dávať pozor aj čo chem vypisovať, lebo to nemusí fungovať správne, viď príklad... Na prvý pohľad, by sa to dalo riešiť tým, že urobíme nové funkcie s rovnakým menom, ktoré budú vracať aj iné typy (teda funkciu do ktorej vstupuje celé číslo a ona vráti jeho absolútnu hodnotu ako desatinné číslo a naopak...). Toto je však práve to čomu sa treba vyhýbať. Nemožno definovať viacero funkcií s rovnakým názvom a rovnakými vstupnými parametrami, ktoré sa líšia len v návratovej hodnote. Keby sme túto funkciu niekedy volali, prekladač by nevedel, ktorú funkciu to vlastne voláme (nevedel by sa rozhodnúť na základe vstupných parametrov.
#include "stdio.h" int maximum (int a){ return(a); } int maximum (int a, int b){ return( a>b?a:b);} int maximum (int a, int b, int c){ if ((a>=b)&(a>=c))return a; if ((b>=c)&(b>=a))return b; if ((c>=a)&(c>=b))return c; } int main(int argc, char* argv[]) { printf("\n%d ",maximum (2)); printf("\n%d ",maximum (-5,0)); printf("\n%d ",maximum (-22,44,44)); char pause=getchar(); return 0; }Toto isté samozrejme existuje aj pre rôzny počet premenných, a dá sa to aj kombinovať (teda vytvoriť funkciu, ktorá sa správa v závislosti na type a počte parametrov)
#include "stdio.h" void printf (int a){ printf("\n%d",a); } void printf (double a){ printf("\n%f",a); } int main(int argc, char* argv[]) { printf(3); printf(3.65); char pause=getchar(); return 0; }Celkom zaujímavé je, že sa dajú preťažovať aj funkcie zo štandardných knižníc... (aj keď je to logické a neexistuje dôvod prečo by to nemalo fungovať...)
(c) Wray 2006