Ссылки в C++

Ссылка в С++ -- это альтернативное имя объекта.

Ссылку можно понимать как безопасный вариант указателя. При этом ссылки имеют особенности, отличающие их от указателей:

  1. При объявлении ссылка обязательно  на уже существующий объект данного типа. Ссылка не может ссылаться "ни на что".
  2. Ссылка от её объявления до её исчезновения указывает на один и тот же адрес.
  3. При обращении к ссылке разыменование происходит автоматически.
  4. Адрес ссылки -- это адрес исходного объекта, на который она указывает.

Объявление ссылок очень похоже на объявление указателей, только вместо звёздочки * пишется амперсанд &.
При объявлении ссылка обязана быть инициализирована.

int &x; // недопустимо!
int &x = veryLongVariableName; // допустимо. Теперь x - это альтернативное имя переменной veryLongVariableName

int A[10];
int &x = A[5]; // Ссылка может указывать на элемент массива
x++;            // то же, что A[5]++;
x = 1;        // то же, что A[5] = 1;

Передача параметров в функцию по ссылке

Параметры можно передавать по ссылкам. При этом связывание ссылки с определённой переменной произойдёт в момент вызова функции (на этапе выполнения программы).

void foo(int &x)
{
  x = 3;
}
int main()
{
  int t = 1;
  foo (t);
  cout << t;  // выведет 3
}

Нужно быть осторожным при передаче значений в такую функцию стороннего разработчика.
Если не планируется изменение передаваемой переменной, функцию лучше объявить так:

void foo(const int &x);

Это гарантирует программисту-пользователю функции неизменность передаваемого значения.

Для типа int передача по константной ссылке обычно не нужна, так как можно просто передать аргумент по значению, но для большого класса или структуры передача по ссылке гораздо быстрее и экономит память.

Чего нельзя делать со ссылкой

Возврат из функции ссылки на автоматически созданный объект (локальную переменную) приводит к появлению "битых ссылок", значение которых непредсказуемо.

Также синтаксис С++ не позволяет создавать указатели на ссылки и массивы ссылок.