В С++ внедрен новый тип данных – ссылка, позволяющая использовать несколько имён объекта.
Формат объявления ссылки:
- тип &идентификатор = идентификатор2;
Такое объявление назначает идентификатор2 переменной с именем, в то время как второе имя просто идентификатор.
При объявлении ссылка всегда должна быть всегда проинициализирована!
int a,b;
int &alt=a; // alt — другое имя переменной а (ссылка на a)
alt = b; // a=b;
alt++; // a++;
Если объявлен указатель
int *ptr = &a;
тогда будут актуальны такие выражения:
*ptr == alt; // истина, сравниваются значения
ptr == &alt; // истина, сравниваются адреса
Ссылку можно рассматривать в качестве постоянного указателя без имени, для которого не нужно выполнять операцию непрямой адресации.
Ссылка является лишь другим именем объекта, а потому не может создавать копии объекта.
Предусмотрена возможность инициализации ссылки на константу:
const char &new_line=’\n’;
В этом случае компилятор создаст некоторую временную переменную temp и ссылку на нее:
char temp = ‘\n’;
const char &new_line = temp;
Передача параметров функции посредством ссылки
Ссылки были введены в C++ с целью передачи параметров в функцию через неё и для получения возвращаемого значения в соответствующем виде. Это необходимо в таких случаях:
- передача в функцию крупных структур во избежание копирования аргументов в стек;
2. передача функции аргументов, которые будут преобразованы самой функцией.
В обоих случаях можно прибегнуть к указателям, что сопровождается дополнительными расходами:
- в функции для этого параметра потребуется выполнение процедуры разыменования;
2. при вызове функции потребуется передача адреса переменной.
В качестве примера можно привести функцию, меняющую два целых числа местами:
При применении ссылок в качестве параметров, одновременно с указанными выше преимуществами есть и недостатки, а именно:
Переданный по ссылке в функцию фактический аргумент может быть изменен функцией независимо от вызывающей программы. Во избежание этого параметры, которые должны быть неизменными, должны определяться с ключевиком const. При попытке изменения объявленного как const параметра появится оповещение об ошибке.
Если в случае вызова функции имеет место быть отсутствие соответствия типов формальных и фактических показателей, язык программирования осуществляет преобразование типа, однако для ссылок оно происходит путем создания промежуточной переменной.
void swap (int &, int &);
int main() {
int x=10;
unsigned int y;
y=5;
swap(x, y);
…
}
Компилятор будет осуществлять такие преобразования:
int temp = (int)y;
int &t = temp;
swap(x, t);
В итоге swap() поменяет значения temp и x местами. Переменная temp будет удалена при выходе из функции, в то время как y останется прежней.
В случае С++ функции могут возвращать ссылку на переменную. Такой тип выражения функции вызова может возникнуть в любой из частей операции
присваивания.
Как правило, необходимость в ссылках возникает в процессе перегрузки операций.