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

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

Формат объявления ссылки:

  • тип &идентификатор = идентификатор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 останется прежней.

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

Как правило, необходимость в ссылках возникает в процессе перегрузки операций.

Нет комментариев

Оставить комментарий