Препратки (references)
Препратката (reference) е алтернативно име на обекта. Поради това често препратките се наричат {\em псeвдоними}. За даден тип T
, типът на препратка към обекти от този тип се обозначава с T&
. Например:
int i=1; int& r=i; r=2;
В ред 2 е дефинирана препратка към променливата i. Когато в ред 3 на препратката r се присвоява нова стойност, тази операция в действителност се извършва с променливата i, към която
препраща r.
При дефиниране на препратка, тя задължително трябва да бъде инициализира с обект от съответния тип. Да разгледаме следния фрагмент:
int& r1; //грешка! int& r2=10; //грешка!
В ред 1 е допусната грешка, тъй като липсва инициализация на препратката r. В ред 2 инициализацията е неправилна, тъй като препратката не е инициализирана с променлива от типа int.
Веднъж дефинирана препратката не може да се пренасочи към друг обект. Точно поради тази причина при дефинирането и е задължително тя да бъде инициализирана. В следващия фрагмент:
int i=1; int& r=i; int i2=2; r=i2;
операцията, която се изпълнява в ред 4 не пренасочва препратката към i2, а присвоява нова стойност на i.
Всички операции, които се извършват върху препратката, в действителност се извършват върху обекта, към който е насочена препратката. Така например:
int i=0; int& r=i; r++; int* p=&r;
В ред 3 операцията се извършва върху променливата i и тя се увеличава с единица. Взимането на адрес от препратка в ред 4 всъщност води до взимането на адреса на променливата i.
Препратките най-често се използват като формални аргументи на функции в случай, че функцията трябва да е в състояние да променя стойността на предадения обект. Например:
void plus2(int& v) { v+=2; } ... int main() { int x=1; plus2(x); ... }
Функцията, дефинирана в ред 1 има за аргумент препратка. Това означава, че при предаване на действителния аргумент ще се създаде препратка към него, и в тялото на функцията ще се работи с препратка към действителния аргумент. Следователно след изпълнението на ред 7, стойността на променливата x ще бъде 3.
Pingback: CPP-101: Кратък обзор на езика за програмиране C++ | Записки по програмиране