Sari la conținut

Capitolul 10 · Lecția 10.2 din 2

Transmiterea parametrilor: valoare vs referință

Diferența esențială dintre parametrii transmiși prin valoare și prin referință, cu exemple de urmărire.

Capitolul 10: Funcții (subprograme)Conținut verificat

Pe scurt pentru BAC · 4 idei

  • Modificările făcute în funcție asupra unui parametru prin valoare nu afectează originalul, iar cele prin referință rămân după apel.
  • Referința se folosește când funcția trebuie să modifice argumentul sau când vrei să „returnezi” mai multe valori.
  • La urmărire notezi pentru fiecare parametru dacă e valoare sau referință, apoi urmărești doar referințele înapoi în main.
  • În f(int x, int &y), ambii parametri cresc cu 10, dar după apelul f(a, b) cu valori 1, a rămâne 1, iar b devine 11.
Pe această pagină5 secțiuni

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

Transmitere prin valoare si prin referinta

#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.

se trimit programului la citire

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

  1. când funcția trebuie să MODIFICE argumentul (interschimbare, citire în funcție);
  2. când vrei să "returnezi" mai multe valori dintr-o funcție.

Interschimbarea clasică (swap):

Interschimbarea a doua valori

#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.

se trimit programului la citire

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.

Atenție

Vectorii se transmit implicit prin ADRESĂ: modificarea elementelor v[i] în funcție se vede în main chiar FĂRĂ &. Alt comportament decât la variabilele simple.

Reține

Valoare înseamnă copie, referință (&) înseamnă aceeași variabilă. Pentru void f(int x, int &y) apelată cu f(a, b), doar b poate fi modificat. Vectorii se transmit prin adresă: modificarea lui v[i] în funcție se vede în main și fără &.

Greșeli frecvente

  1. Lipsa lui & la swap = funcție inutilă (schimbă copii).
  2. Referința cere o VARIABILĂ la apel: f(5) nu compilează dacă parametrul e int&.
  3. Nu confunda & din declarația parametrului (referință) cu & operatorul de adresă.

Bifează când ai terminat, ca s-o vezi citită pe toate dispozitivele.

Testează-te pe capitolul 10

Lecția în clipuri

Clipuri scurte, cu voce și subtitrări.

Folosim cookie-uri esențiale, fără de care site-ul nu merge, și cookie-uri de analiză anonimizate, ca să vedem ce pagini ajută. Detalii în politica de confidențialitate