Содержание

ссылки

Ссылка (reference) представляет способ манипулировать каким-либо объектом. Фактически ссылка - это альтернативное имя для объекта. Для определения ссылки применяется знак амперсанда & (не путать с операцией получения адреса для указателя типа int *pa = &a;)

Нельзя определить пустую ссылку, она всегда должна ссылаться на объект. Также нельзя присвоить ссылке литеральное значение.

После установления ссылки мы можем через нее манипулировать самим объектом, на который она ссылается. Изменения по ссылке неизбежно скажутся и на том объекте, на который ссылается ссылка.

#include <iostream>
 
int main() {
  int number {5};
  int &refNumber {number};
  std::cout << refNumber << std::endl; // 5
  refNumber = 20;
  std::cout << number << std::endl;   // 20
}

Можно определять не только ссылки на переменные, но и ссылки на константы. Но при этом ссылка сама должна быть константной. Инициализировать неконстантную ссылку константным объектом мы не можем. Также константная ссылка может указывать и на обычную переменную, только значение по такой ссылке мы не сможем изменить.

Передача аргумента по ссылке

При передаче параметров по ссылке передается ссылка на объект, через которую мы можем манипулировать самим объектов, а не просто его значением. Чем то это похоже на передачу казателя на объект.

#include <iostream>
 
void square(int&); // прототип функции
 
int main() {
  int n {4};
  std::cout << "Before square: n = " << n << std::endl;
  square(n);
  std::cout << "After square: n = " << n << std::endl;
}
 
void square(int& m) {
  m = m * m; // изменяем значение параметра
  std::cout << "In square: m = " << m << std::endl;
}

Теперь параметр m передается по ссылке. Ссылочный параметр связывается непосредственно с объектом, поэтому через ссылку можно менять сам объект. То есть здесь при вызове функции параметр m в функции square будет представлять тот же объект, что и переменная n