Ссылки: использование нескольких имён объекта

В С++ внедрен новый тип данных – ссылка, позволяющая использовать несколько имён объекта.

Формат объявления ссылки:
тип &идентификатор = идентификатор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++ с целью передачи параметров в функцию через неё и для получения возвращаемого значения в соответствующем виде. Это необходимо в таких случаях:

1. передача в функцию крупных структур во избежание копирования аргументов в стек;
2. передача функции аргументов, которые будут преобразованы самой функцией.

В обоих случаях можно прибегнуть к указателям, что сопровождается дополнительными расходами:

1. в функции для этого параметра потребуется выполнение процедуры разыменования;
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 останется прежней.

В случае С++ функции могут возвращать ссылку на переменную. Такой тип выражения функции вызова может возникнуть в любой из частей операции присваивания.

Как правило, необходимость в ссылках возникает в процессе перегрузки операций.
Ключевые теги:
Понравилась новость? Добавь в закладки!
Хочешь получать свежие новости? Подпишись на обновления с сайта!
Рекомендуем посмотреть:

Добавление комментария

Ваше Имя:
Ваш E-Mail:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Вставка исходного кода Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера

Код:
Включите эту картинку для отображения кода безопасности
обновить, если не виден код
Введите код: