Valoare versus referință

Funcțiile care transmit parametrii prin valoare crează implicit, la nivel local, o copie a valorilor. Pentru tipurile de date simple, precum int sau float, lucrul nu este îngrijorător, dar dacă parametrii sunt din tipuri structurate, este posibil să avem probleme. Spre exemplu, funcția următoare primește ca parametri două șiruri de caractere și returnează rezultatul concatenării lor. string concatenare(string a, string b) { return a+b; } Preluând parametrii prin valoare, funcția face o copie a argumentelor. Fiind vorma de șiruri de caractere, putem avea de manipulat, astfel, cantități considerabile de date. În aceste situații, o idee foarte bună este de a transmite parametrii prin referință (adresă). string concatenare(string &a, string &b) { return a+b; } Argumentele transmise prin referință nu duc la copierea lor. Funcția operează în acest caz direct asupra șirurilor transmise ca argumente. Este evident că această versiune a funcției este mai eficientă decât prima.

Pe de altă parte, prima abordare poate fi cea mai potrivită în situația în care nu dorim modificarea valorilor inițiale. O măsură de siguranță, în acest caz, ar fi să calificăm parametrii drept constante. Exemplul s-ar scrie, în acest caz după cum urmează: string concatenare(const string &a, const string &b) { return a+b; } Procedând astfel, funcției îi este interzis să modifice valorile parametrilor a și b, putând totuși accesa valorile lor fără a face copii locale. Se asigură, deci, o funcționalitate similară cu transmiterea prin valoare, păstrându-se eficiența în cazul tipurilor de date mari.