Užkloties funkcijos Spausdinti
( 4 Votes )

Parašė Vidmantas Šarkys   

 Įsivaizduokime, jog vienu atveju turime atlikti tam tikrą veiksmų seką su sveikaisiais skaičiais, kitu - su realiaisiais. Galime susikurti kelias funkcijas su skirtingais pavadinimais ir naudoti jas pagal savo poreikius. Tačiau jei turėsime daug skirtingų funkcijų,  ne tik sugaišime laiko atsirinkinėdami kurias iš jų naudoti, bet rizikuosime ir susimaišyti. Ypač jei minėtos funkcijos atlikinės tuos pačius arba panašius veiksmus. Tokiems atvejams patartina naudoti užkloties (overloaded) funkcijas.

Užkloties funkcijos pasižymi tuo, jog yra aprašomos tuo pačiu pavadinimu, gali turėti skirtingas kodo eilutes viduje, o kurią jų naudoti nusprendžia kompiliatorius, priklausomai nuo siunčiamų parametrų. Aprašykime dvi užklotines funkcijas:

#include <iostream>
using namespace std;

int sudedam(int sk1, int sk2)
{
  return(sk1+sk2);
} 

double sudedam(double sk3, double sk4)
{
  return(sk3+sk4);
}

int main()
{
 cout << sudedam(10, 15) << endl;
 cout << sudedam(5.2, 677.03) << endl;
 return 0;
}

Kaip matome, funkcijos ne tik priima skirtingo tipo parametrų reikšmes, bet ir pačios grąžina skirtingų tipų duomenis. Tačiau jei funkcijos skiriasi savo tipu, tai nereiškia, kad jos yra užklotinės. Užklotį nusako tik parametrų tipų arba parametrų kiekio skirtumai (jei kelios funkcijos neturi nė vieno parametro, jos nėra laikomos užklotinėmis).

Kurią iš aprašytų užkloties funkcijų naudoti sprendžia kompiliatorius, atsižvelgdamas į siunčiamus parametrus. Jei siunčiami parametrai netenkina nė vienos funkcijos, siunčiamų duomenų tipas yra keičiamas tol, kol randamas atitikmuo su bent viena iš funkcijų. Tiesa, egzistuoja tokių situacijų, kuomet vienareikšmiško atitikmens rasti nepavyksta. Tuomet gaunama dviprasmybė ir išmetama vykdymo klaida:

#include <iostream>
using namespace std;

void Rasyk(unsigned int skaicius)
{
  cout << skaicius;
}
 
void Rasyk(float skaicius)
{
  cout << (skaicius+skaicius);
} 

int main()
{
 Rasyk(5);
 return 0;
}

Skaičius 0 įprastiniu atveju yra laikomas int tipo duomeniu. Kadangi nė viena užkloties funkcija nepriima sveikojo (int) tipo reikšmių, kompiliatorius keičia parametro tipą. Iš int kompiliatorius duomenį gali keisti tiek į unsigned int, tiek į float (lygiaverčiai keitimai). Nors logiškai mums nėra jokio skirtumo į kurį tipą konvertuoti skaičių, programa vykti negali dėl dviprasmybės.