Cele două moduri de transmitere
Prin VALOARE (implicit): funcția primește o COPIE; modificările din funcție NU afectează variabila originală.
Prin REFERINȚĂ (cu &): funcția lucrează direct pe variabila originală; modificările RĂMÂN după apel.
Exemplul care lămurește tot
#include <iostream>
using namespace std;
void f(int x, int &y) {
x = x + 10;
y = y + 10;
}
int main() {
int a = 1, b = 1;
f(a, b);
cout << a << " " << b;
return 0;
}Atenție: C++ foloseste ampersand, C foloseste pointeri, Pascal foloseste cuvantul var inaintea parametrului. Python transmite mereu referinta la obiect, dar numerele sunt imutabile, asa ca pentru a imita comportamentul s-a folosit o lista.
Afișează: 1 11. Explicație: x e copie a lui a (a rămâne 1), dar y e REFERINȚĂ la b (b devine 11).
Când folosești referința
- când funcția trebuie să MODIFICE argumentul (interschimbare, citire în funcție);
- când vrei să "returnezi" mai multe valori dintr-o funcție.
Interschimbarea clasică (swap):
#include <iostream>
using namespace std;
void schimba(int &a, int &b) {
int aux = a;
a = b;
b = aux;
}
int main() {
int x = 3, y = 8;
schimba(x, y);
cout << x << " " << y;
return 0;
}Atenție: Fara referinta, functia ar schimba doar copiile si valorile din main ar ramane neschimbate.
Fără &, funcția ar interschimba doar copiile: variabilele reale ar rămâne neschimbate. E cea mai frecventă capcană de subiect II.
Urmărirea la BAC (subiectul II)
La "ce afișează programul", notează pentru FIECARE parametru: valoare (copie, moare la final) sau referință (alias, modifică originalul). Apoi urmărește doar referințele înapoi în main.
Greșeli frecvente
- Lipsa lui & la swap = funcție inutilă (schimbă copii).
- Referința cere o VARIABILĂ la apel: f(5) nu compilează dacă parametrul e int&.
- Nu confunda & din declarația parametrului (referință) cu & operatorul de adresă.