Generalități

Funcţiile permit, pe de o parte, structurarea codului, îmbunătăţind lizibilitatea, iar pe de altă parte contribuie la reutilizarea codului, putând fi utilizate, in cadrul unui program, de oricâte ori. În C++, ele sunt alcătuite dintr-o listă de intrucţiuni, cărora li se ataşează o etichetă prin care acestea pot fi invocate la un moment dat pe parcursul execuţiei. Sintaxa generală este:

```
<tip_baza> <identificator_nume> ([<parametru1>], [<parametru2>], …)

{

{instrucţiuni;}

}

```

Tip\_baza este tipul valorii returnate de funcţie. Identificator\_nume este identificatorul prin care funcţia urmează a fi apelată. Parametrii, specificaţi prin tip de bază şi nume, fiind, practic variabile, şi separaţi prin virgulă, sunt folosiţi pentru a transmite, pe de o parte, funcţiei anumite date de intrare, iar pe de altă parte, printr-un mecanism special, instanţei apelante, rezultatul unor prelucrări. Aceste trei elemente formează aşa numitul antet al funcţiei.

Instrucţiunile formează corpul funcţiei. Sunt scrise între acolade şi determină, efectiv, efectul funcţiei.

Să analizăm un exemplu:

```
#include <iostream>

using namespace std;

int suma(int x, int y)

{

int s;

s=x+y;

return s;

}

int main ()

{

int a,b,c;

cin>>a>>b;

c = suma (a,b);

cout <<a<<’+’<<b<<”= " << c;

}

```

Programul este alcătuit din două funcţii, suma şi main. Indiferent de alcătuire, un program C++ va începe, întotdeauna cu executarea funcţiei main. Celelalte funcţii sunt executate doar dacă sunt apelate în main sau într-o altă funcţie, apelată, la rândul ei de aceasta.

În funcţia main, se face, iniţial, declararea variabilelor a,b,c, de tip int. După citirea variabilelor a şi b este apelată funcţia sumă, într-o expresie care atribuie valoarea retunată de aceasta variabilei c. La momentul apelului funcţiei suma, controlul execuţiei este trecut acesteia, funcţia main fiind suspendată. Revenirea în main se va face atunci când funcţia suma îşi încheie execuţia.

Observăm că funcţia suma are doi parametri, numiţi, formali, x şi y. Apelul se face, însă cu variabilele a şi b ca parametri efectivi. Astfel, valorile acestora sunt transmise către x şi y. Nu este necesar, deci, ca parametrii efectivi şi cei formali să aibă acelaşi nume. Este important, totuşi ca ei să fie aşezaţi în ordinea în care se doreşte transmiterea şi să fie din acelaşi tip sau din tipuri care pot fi convertite implicit.

În interiorul funcţiei suma este declarată o altă variabilă, s, care primeşte valoarea obţinută din însumarea parametrilor a şi b. Ulterior, aceasta este trecută sub instrucţiunea return, fapt ce înseamnă că apelul acestei funcţii va fi înlocuit, în instanţa apealantă, prin valoarea variabilei s. Prin urmare, valoarea c, din funcţia main va primi valoarea determinată prin însumarea variabilelor a şi b. Desigur, am fi putut scrie direct acest lucru, folosind operatorul +. Exemplul este lipsit de altă utilitate, în afara celei didactice, dar este bun în a ne ajuta să înţelegem mecanismul.

În această situaţie, apelul ar putea fi făcut şi din altă funcţie, de exemplu cout. Am putea scrie:

```
cout<<suma(a,b); , evitând utilizarea variabilei c.

```

Apelul funcţiei, în instrucţiunea de apel nu ar produce, în acest caz, niciun efect. Ar fi, deci, deşi corect, inutil să scriem:

```
suma(a,b);

```

Se cuvine să precizăm, după cum argumentam pentru utilizarea funcţiilor, că funcţia suma poate fi utilizată de oricâte ori este nevoie.

Să mai adăugăm că în locul parametrilor efectivi putem trece o valoare din tipul în care aceştia sunt definiţi. Continuând exemplul, putem scrie:

```
cout<<suma(4+6);

```

Este evident că dacă am încerca să folosim funcţia suma, definită anterior pentru a calcula, de exemplu, suma dintre 3.56 şi 8.38, într-o sintaxă de forma:

```
cout<<suma(3.56, 8.38);

```

, am obţine valoarea 11. Faptul se datorează conversiei implicite la int, tipul parametrilor formali, a valorilor de apel.

Apelurile funcţiilor pot fi folosite ca operanzi cu care se pot construi diferite expresii. Putem scrie:

```
cout<<suma(2,6)+suma(4,8);

```

Desigur, apelurile funcţiilor pot fi folosite, la rândul lor, ca valori de apel pentru alte funcţii sau chiar pentru ele însele. Astfel, exemplul anterior ar putea fi scris:

```
cout<<suma(suma(2,6), suma(4,8));

```