# Funcții în C++: definire și parametri

> Pagina: https://bacalaurescu.ro/informatica/lectii/functii/definirea-functiilor
> Markdown: https://bacalaurescu.ro/informatica/lectii/functii/definirea-functiilor.md
> Sursa: Bacalaurescu (bacalaurescu.ro), conținut gratuit pentru BAC 2027.

Materia: [Informatică](https://bacalaurescu.ro/informatica)

Capitolul: [Funcții (subprograme)](https://bacalaurescu.ro/informatica/lectii/functii)
Actualizat: 2026-11-01

Funcții void și cu rezultat, parametri transmisi prin valoare și prin referință.

## Pe scurt pentru BAC

- O funcție grupează un calcul sub un nume, ca să-l refolosești și să împarți problema în pași mici.
- Rezultatul unei funcții se poate afișa direct, ca în `cout << patrat(5);`, care afișează 25.
- Funcția `schimba(int &a, int &b)` interschimbă valorile printr-o variabilă auxiliară, iar datorită lui `&` schimbarea se vede în `main`.
- Fără `&`, aceeași funcție ar interschimba doar copiile, iar afișarea ar rămâne `3 9`.

## De ce funcții

O **funcție (subprogram)** grupează un calcul sub un nume, ca să-l refolosești și să împarți problema în pași mici.

## Funcție cu rezultat

~~~cpp
int patrat(int x) {
    return x * x;
}

int main() {
    cout << patrat(5);
    return 0;
}
~~~

Afișează `25`. Tipul din fața numelui (`int`) este tipul rezultatului; `return` îl trimite înapoi.

## Funcție void

O funcție `void` execută ceva, dar nu întoarce niciun rezultat:

~~~cpp
void salut(int n) {
    for (int i = 0; i < n; i++)
        cout << "Salut!" << "\n";
}
~~~

## Valoare vs. referință

**Prin valoare** (implicit): funcția primește o COPIE; originalul nu se schimbă.

**Prin referință** (cu `&`): funcția lucrează direct pe variabila originală.

~~~cpp
void schimba(int &a, int &b) {
    int aux = a;
    a = b;
    b = aux;
}

int main() {
    int x = 3, y = 9;
    schimba(x, y);
    cout << x << " " << y;
    return 0;
}
~~~

Afișează `9 3`: datorită lui `&`, interschimbarea se vede în `main`.

> [!ATENTIE]
> Fără `&`, funcția ar interschimba doar copiile, iar afișarea ar rămâne `3 9`. La subiectele de BAC, prezența sau absența lui `&` schimbă complet răspunsul.

> [!RETINE]
> Tipul scris în fața numelui este tipul rezultatului, trimis înapoi cu `return`; o funcție `void` nu întoarce nimic. Un parametru fără `&` primește o copie (originalul rămâne neschimbat), unul cu `&` lucrează direct pe variabila originală.

## Greșeli frecvente

1. Funcție declarată `int` fără `return` pe toate ramurile: rezultat imprevizibil.
2. Parametrii prin valoare NU modifică argumentele originale, oricât i-ai modifica în funcție.
3. Variabilele locale ale funcției dispar la ieșire; ce vrei să păstrezi întorci cu `return` sau prin referință.
