2.5. Transmiterea parametrilor prin referin?e
2.5. Transmiterea parametrilor prin referin?e
?n limbajul C exist? doar o singur? modalitate de transmitere a parametrilor ?n func?ii: prin valoare (copie). Astfel, dac? vrem ca o func?ie s? modifice valoarea variabilelor care se transmit ca parametri, trebuie transmise func?iei adresele variabilelor respective.
De exemplu, avem nevoie de o func?ie care schimb? reciproc valorile ?ntre dou? variabile. A?a func?ie poate fi de mare folos la sortarea elementelor unui vector. Versiunea func?iei reprezentat? ?n urm?torul program este gre?it?.
#include "iostream.h" void schimba_reciproc(double a, double b) // parametrii vor fi transmi?i prin valoare { double temp = a; a = b; b = temp; } void main() { double x=2.5, y=3.14; cout << "x=" << x << " y=" << y << endl; schimba_reciproc(x, y); cout << "x=" << x << " y=" << y << endl; char c; cin >> c; } |
Fiindc? la apelul func?iei schimba_reciproc(x, y) vor fi transmise copiile valorilor variabilelor x ?i y, valorile variabilelor x ?i y ?n func?ia main() vor r?m?ne neschimbate. Aceasta confirm? ?i rezultatul programului:
x=2.5 y=3.14 x=2.5 y=3.14 |
Observ?m c? valorile variabilelor x ?i y au r?mas acelea?i. ?n limbajul C exist? o solu?ie unic? de a rezolva aceast? problem?. Trebuie de transmis func?iei adresele variabilelor ?i nu valorile lor. Modific?m programul precedent, ?ntruc?t el va ar?ta astfel:
#include "iostream.h" void schimba_reciproc(double *a, double *b) // se transmit dou? adrese (doi pointeri) { double temp = *a; *a = *b; *b = temp; } void main() { double x=2.5, y=3.14; cout << "x=" << x << " y=" << y << endl; schimba_reciproc(&x, &y); // transmitem adresele // variabilelor x ?i y cout << "x=" << x << " y=" << y << endl; char c; cin >> c; } |
Func?ia schimba_reciproc() a fost modificat? esen?ial. Acum ea prime?te ?n calitate de argumente doi pointeri cu adresele variabilelor de tipul double. Prin intermediul acestor pointeri func?ia dat? are acces la variabilele x, y din func?ia main(). Atragem aten?ia c? s-a schimbat ?i modul de apelare a func?iei schimba_reciproc(). Lans?m programul ?i ob?inem:
x=2.5 y=3.14 x=3.14 y=2.5 |
Acum rezultatele sunt corecte. Totu?i, ultima versiune a func?iei are un neajuns. De fiecare dat? c?nd programatorul scrie ?n program apelul func?iei schimba_reciproc(), el trebuie s? ?in? cont c? se indic? adresele variabilelor ?i nu ?nse?i variabilele. Adic?, dac? ar fi posibil apelul:
schimba_reciproc(x, y);
el va arat? mai simplu, mai laconic ?i mai natural dec?t apelul:
schimba_reciproc(&x, &y);
?n limbajul C++ exist? posibilitatea de a transmite parametrii ?n func?ii prin referin??.
Pentru ca prima versiune a programului s? fie corect?, modific?m ?n ea doar antetul la descrierea func?iei schimba_reciproc() astfel:
void schimba_reciproc(double &a, double &b)
// parametrii se transmit prin referin?e
Restul r?m?ne acela?i, inclusiv modul de apelare a func?iei schimba_reciproc(). Lans?m programul ?i ne convingem c? rezultatul va fi corect, adic? coincide cu cel de la versiunea cu pointeri.
Transmiterea parametrului prin referin?? (cum ar fi double &a) ?nseamn? c? func?ia respectiv? va lucra direct cu variabila care va fi pus? ca argument ?n apelul acestei func?ii.
Observ?m c? ?ntr-o func?ie se admite combinarea arbitrar? a modurilor de transmitere pentru parametri diferi?i. Programatorul el ?nsu?i urm?re?te acest lucru. De exemplu:
double suma(double *a, int n, int &k) { … } |
Func?ia suma() are trei parametri. Primii doi se transmit prin valoare ?i ultimul prin referin?e.
_________________________
Autorul: dr.conf. S. Pereteatcu
Оставить комментарий