Curs C++ | Sectiunea 22 – Functii Supraincarcate(Overloaded)

 

Incepem aceasta sectiune cu un exemplu. Avem nevoia de a calcula maximul dintre doua numere asa ca vom scrie o functie pentru acest lucru.

float max(float x, float y) {
if (x > y) return x;
else return y;
}

❓ Se poate intampla ca la un moment dat sa nu mai avem nevoie de maximul dintre doua numere ci dintre trei. Ce putem sa facem? O prima varianta ar fi sa ne folosim de functia noastra deja implementata.

std::cout << max(max(x,y),z);

Nu este prea elegant, nu-i asa? Nu este nici eficient. Ar fi mai bine sa uitam de vechea functie si sa scriem una noua ce corespunde noilor cerinte, fara a o sterge pe cea veche. Sa pastram acelasi nume, max, si de data aceasta.

float max(float x, float y, float z) {
float max = x;
if (y > max) max = y;
if (z > max) max = z;

return max;
}

💡 Veti observa ca desi avem doua sau mai multe functii cu acelasi nume, programul nostru compileaza si functioneaza corespunzator. Mecanismul ce ne permite acest lucru poarta numele de supraincarcare (overloading).

Toate functiile supraincarcate trebuie sa fie clar diferentiabile pentru compilator. Acesta nu poate ezita in a alege ce functie supraincarcata trebuie folosita in cazurile particulare din program. Avem astfel urmatoarele moduri in care compilatorul distinge functiile:

  • numarul de parametri: spre exemplul in cazul nostru avem o functie ce primeste 2 parametri si una 3
  • tipul parametrilor: daca exista mai multe functii cu acelasi nume si acelasi numar de parametri, distinctia se va face pe baza tipurilor acestora

📝 Tipul returnat nu este luat in considerare in momentul in care compilatorul cauta cel mai bun candidat pentru invocare. Acest lucru se intampla deoarece valoarea returnata a unei functii poate fi ignorata. Astfel, doua functii ce difera doar prin tipul returnat sunt identice pentru compilator.

int function (int a) {
return a;
}

float function (int a) {
return a;
}

In acest caz am avea eroarea ambiguating new declaration of ‘float function(int)’.

 

Cum sa gasim cel mai bun candidat?

int function (int a) {
return a;
}

int function (float a) {
return a;
}
...
function(10);

❓ Ce functie credeti ca se va invoca in acest caz? Daca v-ai gandit la prima, este corect. Sa facem o mica modificare si sa mai punem intrebarea aceasta o data.

function(10.0);

❗ De data aceasta nu este niciun candidat corespunzator pentru invocare. De ce? Literalul 10.0 nu este de tip float. Acesta este de tip double. Compilatorul C++ incearca sa promoveze tipurile daca nu exista o potrivire exacta.

📝 Directia acestei promovari merge de la mai putin precisa la mai precisa, nu si invers. Astfel ca orice float poate fi promovat ca double dar niciun double nu poate fi promovat ca float. Avem doua variante de urmat:

  • scriem o a treia instanta a acestei functii cu un parametru de tip double
  • convingem compilatorul ca literalul este de tip float; facem acest lucru prin sufixul f, astfel function(10.0f);

 

Operatorul Conditional

💡 Folosim aceasta oportunitate pentru a introduce un nou operator, : ?, poarta si numele de operator conditional si are nevoie de trei argumente.

expression1 ? expression2 : expression3
  1. calculeaza valoare lui expression1
  2. daca rezulatul este diferit de zero (non-zero), operatorul returneaza valoarea lui expression2, neglijand expression3
  3. daca rezultatul de la pasul 1 este zero, operatorul returneaza valoarea lui expression3, neglijand expression2

Pentru o mai buna intelegere, urmatoarele doua instructiuni sunt identice:

//Varianta 1
i = i > 0 ? 1 : 0;

//Varianta 2
if (i > 0) i = 1;
else i = 0;

❗ Se mai poate numi si operator ternar, fiind singurul operator ce primeste trei argumente.

 

Aici se termina si aceasta sectiune 🙂 . Puteti incerca, ca un mic exercitiu, sa rescrieti functioa noastra de max folosind noul operator invatat. Pentru intrebari suplimentare puteti folosi informatiile de aici.

➡ Sectiunea anterioara:Curs C++ | Sectiunea 21 – Functii Inline

➡ Sectiunea urmatoare:Curs C++ | Sectiunea 23 – Alocare de memorie

You may also like...