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 neschimbataPrin 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;
}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ă.
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).