References - Referinţe O referinţă este un nume alternativ pentru un obiect. Principala folosire a referinţelor este pentru a specifica argumentele şi valorile returnate pentru funcţii în general şi pentru supraîncărcarea operatorilor în particular. Notaţia &X înseamnă referinţă la X. Iniţializarea unei referinţe este obişnuită când iniţializatorul este o l-valoare (un obiect a cărui adresă o puteţi obţine). Iniţializatorul pentru un “banal” T& trebuie să fie o l-valoare de tip T. Iniţializatorul pentru un const T& nu trebuie să fie neapărat o l-valoare sau chiar de tip T. În acest caz: 1. mai întâi, conversia implicită la T este aplicată dacă este necesară; 2. apoi, valoarea rezultată este pusă într-o variabilă temporară de tip T; 3. în cele din urmă, această variabilă temporară este folosită ca valoare a iniţializatorului. De exemplu: const int& cir = 1; Interpretarea acestei iniţializări ar putea fi: int temp = temp(1); //mai întâi se creează o variabilă temporară cu valoarea cerută const int& cir = temp; //apoi se foloseşte această variabilă pentru iniţializarea lui cir O referinţă poate fi folosită pentru a specifica un argument pentru o funcţie în aşa fel încât funcţia poate schimba valoarea unui obiect care i-a fost trimis ca argument. De exemplu: void increment(int& aa) {aa++;} // “aa” este argumentul de tip referinta la int al functiei void main() { int x = 1; increment(x); // se face conversia lui int x la int& x } Semantica trimiterii argumentului este definită ca aceea a iniţializării, astfel încât când este apelat, argumentul formal “aa” devine un alt nume pentru x. Pentru a păstra programele uşor de înţeles, cel mai bine este să evitaţi funcţiile care modifică argumentele. Mai bine faceţi ca funcţia să returneze o valoare sau folosiţi un pointer ca argument. De exemplu: int increment_v(int p) {return p+1;} void increment_p(int* p) {(*p)++;} Notaţia increment(x) nu dă nici un indiciu cititorului că valoarea x urmează să fie modificată, celelalte două (increment_v şi increment_p) dau. În consecinţă, “simplele” argumente de tip referinţă ar trebui să fie folosite doar unde numele funcţiei oferă o puternică idee că argumentul referinţă este modificat. Referinţele pot de asemenea fi folosite pentru a defini funcţii care pot fi folosite în ambele părţi ale unei asignări (stânga – left-hand şi dreapta – right-hand). Din nou, multe din cele mai interesante folosiri ale acestora sunt găsite în crearea neobişnuitelor tipuri definite de utilizator. Vezi p. 99 din Bjarne Stroustrup.