Ссылки


Ссылка (reference) представляет способ манипулировать каким-либо объектом. Фактически ссылка - это альтернативное имя для объекта. Для определения ссылки применяется знак амперсанда &:

int number = 5;
int &refNumber = number;
В данном случае определена ссылка refNumber, которая ссылается на объект number. При этом в определении ссылки используется тот же тип, который представляет объект, на который ссылка ссылается, то есть в данном случае int.

При этом нельзя просто определить ссылку:

int &refNumber;
Она обязательно должна указывать на какой-нибудь объект.

Также нельзя присвоить ссылке литеральное значение, например, число:

int &refNumber = 10;
После установления ссылки мы можем через нее манипулировать самим объектом, на который она ссылается:

#include <iostream>

int main()
{
int number = 5;
int &refNumber = number;
std::cout << refNumber << std::endl; // 5
refNumber = 20;
std::cout << number << std::endl; // 20

return 0;
}
Изменения по ссылке неизбежно скажутся и на том объекте, на который ссылается ссылка.

Можно определять не только ссылки на переменные, но и ссылки на константы. Но при этом ссылка сама должна быть константной:

const int number = 5;
const int &refNumber = number;
std::cout << refNumber << std::endl; // 5
//refNumber = 20; изменять значение по ссылке нельзя
Инициализировать неконстантную ссылку константным объектом мы не можем:

const int number = 5;
int &refNumber = number; // ошибка
Также константная ссылка может указывать и на обычную переменную, только значение по такой ссылке мы не сможем изменить:

int number = 5;
const int &refNumber = number;
std::cout << refNumber << std::endl; // 5

//refNumber = 20; изменять значение по ссылке на константу нельзя

// но мы можем изменить саму переменную
number = 20;
std::cout << refNumber << std::endl; // 20
В данном случае несмотря на то, что мы не можем напрямую изменить значение по константной ссылке, тем не менее мы можем изменить сам объект, что приведет естественно к изменению константной ссылки.