Ссылки представляют собой второе имя (или псевдоним) объекта; объявляются при помощи символа &, при объявлении обязательно должны быть инициализированы именами тех объектов, псевдонимами которых они будут являться.
double agent = .028;
double &bond = agent;
// …
bond /= 4.0 // agent ~ .007
В общем случае в качестве инициализирующего выражения должно выступать имеющее значение L-выражение (имя объекта, реально существующего в памяти). Значением ссылки после определения с инициализацией становится адрес этого объекта. Повторное присвоение значения ссылке не допускается, т.е. невозможно сделать так, чтобы некоторая конкретная ссылка ссылалась на другой объект.
В определении ссылки символ & не является частью типа, т.е. имя bond имеет тип double.
Могут существовать ссылки на любые используемые в программе типы, как стандартные, так и созданные программистом (записи, классы и т.п.), кроме перечисленных ниже.
Функционально ссылка ведет себя подобно обычной переменной того же типа.
Ссылки повышают эффективность программ при передаче больших объектов в функции, поскольку не требуют копирования объекта в стек;
– предоставляют функциям механизм изменения значения передаваемого им аргумента (за счёт передачи адреса объекта, подобно указателю, а не копии объекта);
– используются, главным образом, при определении компонентных функций классов;
– не являются самостоятельными объектами и существуют только после инициализации; какие-либо операции выполняются не над ссылками, а над объектами, на которые они ссылаются;
int i;
int &ir = i;
ir = 3; // i = 3
int j;
j = i * ir; // j ~ 9
ip = &ir; // ip получает адрес i
– не могут ссылаться на другую ссылку или на битовое поле. Не может быть ни массивов ссылок, ни указателей на ссылку, но может быть объявлена ссылка на указатель.
int *&rpi;
Если тип инициализированной ссылки не совпадает с типом объекта, то создается анонимный объект, для которого ссылка является псевдонимом, инициализирующее значение преобразуется к типу ссылки и используется установки значения анонимного объекта.
double d;
int &ir = d; // несовпадение типов => анонимный объект
ir = 3.0; // значение d не изменилось, анонимный объект получил значение 3
Ссылка не может иметь тип void, для ссылки нельзя выделить участок памяти операцией new. Значение ссылки не может изменяться. Но любой объект может быть адресован любым количеством ссылок (также как и указателей).
Можно определить ссылку на константу, используя модификатор const. Ссылка на константу не позволяет изменить значение того объекта, с которым она связана.