Hola25
Hola25 Logo
Hola25
Utilizatori disponibili

Înapoi la blog

Două trasee de piese sugerează o copie separată și o legătură directă între două puncte.
Ilustrație conceptuală generată cu AI; explicațiile și schemele de învățare sunt în articol.
Informatică

Parametri prin valoare și referință la BAC: C++

Hola25
Hola25
Autor

21 octombrie 2026

7 min citire

În acest articol

Transmiterea parametrilor prin valoare și prin referință stabilește dacă un subprogram lucrează cu o copie sau poate modifica variabila din apel. La BAC, această diferență explică multe rezultate aparent surprinzătoare: o variabilă poate fi schimbată în interiorul funcției, dar valoarea din programul apelant poate rămâne aceeași.

Lecția privește subprogramele definite de utilizator din programa de referință pentru matematică-informatică. Vom urmări apelurile pas cu pas, fără să ne bazăm pe numele variabilelor. Când rezolvi un subiect de BAC la informatică, citește mai întâi antetul subprogramului și ordinea parametrilor, apoi instrucțiunile din corp.

Parametru formal și parametru efectiv

Parametrul formal este numele declarat în antetul subprogramului. Parametrul efectiv este argumentul folosit la apel. De exemplu, o funcție poate avea parametrul formal x și poate fi apelată cu variabila a.

Numele nu trebuie să coincidă. Legătura se face prin poziția argumentului în apel și prin modul de transmitere. Două variabile numite la fel, dar aflate în domenii diferite, nu devin automat aceeași variabilă.

La fiecare apel trebuie să identifici ce valoare primește fiecare parametru și ce modificări pot reveni în programul apelant. Un tabel scurt cu numele formale și argumentele efective previne confuzia, mai ales când ordinea este inversată.

Prin valoare: funcția primește o copie

Un parametru declarat ca întreg simplu primește valoarea argumentului. În corpul funcției, parametrul poate fi modificat, însă schimbarea privește copia locală. Variabila folosită la apel nu este modificată prin acel parametru.

Dacă a are valoarea trei și funcția adaugă zece parametrului primit prin valoare, copia ajunge la treisprezece. După întoarcere, a rămâne trei, dacă nu există o altă instrucțiune care îl modifică.

Transmiterea prin valoare este potrivită când funcția are nevoie de o intrare pe care o poate prelucra local. De exemplu, poate împărți repetat o copie a unui număr pentru a-i analiza cifrele fără să distrugă valoarea originală.

Prin referință: funcția poate modifica argumentul

În C++, un parametru referință se declară folosind semnul ampersand lângă tip. Parametrul desemnează variabila transmisă, astfel încât o atribuire făcută prin el schimbă acea variabilă.

Pentru un parametru întreg transmis prin referință neconstantă, apelul trebuie să furnizeze o variabilă potrivită, nu o valoare literală sau un calcul temporar. Funcția are nevoie de un obiect pe care îl poate modifica.

Declarație de parametru Interpretare în această lecție Efectul atribuirii
int x Copie a valorii Modifică parametrul local
int &x Referință la variabila apelantului Modifică variabila transmisă

Semnul din declarație nu se repetă în apel. Apelezi funcția cu numele variabilei, iar antetul stabilește mecanismul. Nu adăuga automat un operator în fața argumentului doar fiindcă ai văzut referința în antet.

Program urmărit în trei etape

Programul citește două numere întregi între minus o mie și o mie. Prima funcție primește primul argument prin valoare și al doilea prin referință. A doua funcție schimbă între ele valorile a două variabile transmise prin referință.

#include <iostream>
using namespace std;

void modifica(int x, int &y) {
    x = x + 10;
    y = y + x;
}

void schimba(int &x, int &y) {
    int temporar = x;
    x = y;
    y = temporar;
}

int main() {
    int a, b;
    cin >> a >> b;
    modifica(a, b);
    cout << a << ' ' << b << '\n';
    schimba(a, b);
    cout << a << ' ' << b << '\n';
    modifica(a, a);
    cout << a << ' ' << b;
    return 0;
}

Pentru intrarea trei și cinci, primul apel creează copia x cu valoarea trei, iar y desemnează variabila b. Copia devine treisprezece, apoi b devine optsprezece. Prima linie afișată este trei și optsprezece.

Schimbul prin referință produce a egal cu optsprezece și b egal cu trei. Variabila temporară păstrează valoarea inițială a primului argument până când aceasta poate fi scrisă în al doilea.

Același argument în două poziții

Ultimul apel transmite variabila a atât primului, cât și celui de-al doilea parametru. Primul este însă o copie, iar al doilea este referință. Copia pornește de la optsprezece și devine douăzeci și opt.

Parametrul referință adaugă această valoare la a, care era încă optsprezece. Rezultatul este patruzeci și șase. Variabila b rămâne trei, deoarece nu participă la acest apel.

Faptul că argumentele au același nume în apel nu schimbă mecanismul parametrilor. Trebuie să urmărești separat copia și variabila desemnată prin referință. Pentru mai multe referințe la aceeași variabilă, modificările se pot influența direct în ordinea instrucțiunilor.

De ce schimbul are nevoie de o valoare temporară

Dacă scrii mai întâi x egal cu y și apoi y egal cu x, valoarea inițială a lui x s-a pierdut înaintea celei de-a doua atribuiri. Ambele variabile ajung să păstreze valoarea inițială a lui y.

Variabila temporară salvează informația care ar fi suprascrisă. După prima atribuire, aceasta rămâne disponibilă pentru a doua. Schema este ușor de verificat cu două numere distincte, deoarece un test cu valori egale ar ascunde eroarea.

Dacă funcția de schimb ar primi ambii parametri prin valoare, ar schimba doar copiile locale. Programul apelant nu ar vedea schimbul. Prin urmare, atât corpul funcției, cât și antetul trebuie să corespundă cerinței.

Valoare returnată și parametru modificat

O funcție poate comunica un rezultat prin valoarea returnată. Programul apelant trebuie să folosească acel rezultat, de exemplu într-o atribuire. Simplul apel al unei funcții care returnează un număr nu modifică automat argumentul primit prin valoare.

Un subprogram fără valoare returnată poate comunica rezultate prin parametri referință. Cele două mecanisme pot fi combinate, dar alegerea trebuie să urmeze antetul cerut în problemă. Nu transforma un parametru de ieșire într-un rezultat returnat dacă cerința impune o anumită interfață.

Pentru claritate, notează lângă fiecare parametru dacă este intrare, ieșire sau ambele. Această descriere logică nu înlocuiește sintaxa, însă arată ce trebuie să rămână adevărat după apel.

Tabel de urmărire pentru apelul complet

Moment, pentru intrarea 3 și 5 a b
Înaintea apelurilor 3 5
După modificarea cu o copie și o referință 3 18
După schimb 18 3
După apelul cu a în ambele poziții 46 3

Tabelul descrie numai variabilele din programul principal. Copia locală trebuie urmărită separat pe durata fiecărui apel. Amestecarea celor două niveluri într-o singură coloană este o sursă obișnuită de erori.

Explicarea acestor stări este mai utilă decât memorarea unei definiții izolate despre referințe. Poți aplica aceeași metodă de învățare prin înțelegere oricărui subprogram scurt dintr-un test.

Exerciții cu răspunsuri

Prima funcție este apelată cu a egal cu zero și b egal cu doi. Copia devine zece, a rămâne zero, iar b devine doisprezece.

Funcția de schimb primește aceeași variabilă în ambele poziții. Pentru implementarea prezentată, valoarea rămâne aceeași. Nu există două valori distincte care să fie permutate.

Un parametru transmis prin valoare este împărțit repetat la zece. Variabila originală din apel rămâne disponibilă cu valoarea inițială, dacă nu este modificată prin alt mecanism.

Întrebări frecvente

Numele parametrului trebuie să coincidă cu argumentul?

Nu. Poziția în apel și declarația din antet stabilesc legătura. Numele pot fi complet diferite fără să schimbe comportamentul.

O funcție cu rezultat returnat poate modifica și un argument?

Da, dacă are și un parametru potrivit transmis prin referință. Urmărește fiecare mecanism separat și respectă cerința problemei.

Cum verific o soluție cu parametri amestecați?

Desenează copii pentru parametrii prin valoare și legături către variabile pentru referințe. Dacă un rezultat rămâne neclar, poți parcurge apelul cu un profesor de informatică.

Surse