Funcții

Mediu~15 min10 pași

De ce contează?

O rețetă spune „bate ouăle" o dată, iar apoi o folosești ori de câte ori e nevoie, fără s-o rescrii. O funcție e exact asta în program: o bucată de logică pe care o definești o dată și o reapelezi oriunde, dând de fiecare dată alte ingrediente (parametri).

Ce este o funcție

O funcție grupează o bucată de cod sub un nume. Primește date prin parametri și, de obicei, returnează un rezultat. O scrii o dată, o folosești de câte ori vrei — codul devine mai scurt, mai clar și mai ușor de testat.

#include <iostream>
using namespace std;

int maxim(int a, int b) {       // tip return, nume, parametri
    if (a > b) return a;
    return b;
}

int main() {
    cout << maxim(3, 8) << "\n";    // 8
    cout << maxim(10, 2) << "\n";   // 10
    return 0;
}

Parametri prin valoare: o copie

Implicit, funcția primește o copie a argumentului. Modificările din funcție nu se văd afară:

void incearca(int x) {
    x = 100;            // modifica doar copia locala
}
// dupa apel, variabila originala e neschimbata
Observația-cheie

Prin valoare, funcția lucrează pe o copie — sigur, dar modificările rămân locale. E modul implicit și potrivit când funcția doar citește argumentul.

Parametri prin referință: pe original

Cu &, funcția lucrează direct pe variabila originală — o poate modifica:

void dubleaza(int& x) {     // & = referinta
    x = x * 2;              // modifica originalul
}

int main() {
    int n = 5;
    dubleaza(n);
    cout << n << "\n";      // 10
    return 0;
}

Schimbul a două variabile, clasic:

void schimba(int& a, int& b) {
    int t = a; a = b; b = t;
}
Observația-cheie

Două motive pentru referință: (1) vrei ca funcția să modifice argumentul (ex. swap); (2) argumentul e mare (vector, struct) și copierea ar fi costisitoare. Pentru citire fără modificare a unui obiect mare, folosești const&.

Complexitate

Apelul în sine e O(1) plus costul corpului. Atenție: transmiterea prin valoare a unui vector mare copiază O(n) elemente la fiecare apel — un cost ascuns. Referința îl evită.

Greșeli frecvente

Capcane reale la funcții:

  • Aștepți modificări de la un parametru prin valoare: funcția schimbă copia, nu originalul. Folosește & dacă vrei efect afară.
  • Copiezi structuri mari prin valoare: cost O(n) la fiecare apel. Transmite prin const& pentru citire.
  • Uiți return: o funcție cu tip de return care nu returnează pe toate ramurile dă comportament nedefinit.
  • Variabile locale vs globale: o variabilă locală „umbrește" una globală cu același nume — atenție la ce modifici de fapt.

De reținut

  • Funcția = bloc de cod cu nume, parametri și (de obicei) un return; o scrii o dată, o reapelezi.
  • Prin valoare = copie (modificările rămân locale); prin referință & = pe original.
  • Folosește referința ca să modifici argumentul sau să eviți copierea obiectelor mari (const& pentru citire).

Întrebarea 1 / 3

Ce este o funcție?