Ссылки

Ссылка — это переменная, которая является псевдонимом другой переменной. Присвоить значение ссылке можно только при ее объявлении. Тип ссылки должен совпадать с типом переменной. Объявление выглядит следующим образом:

<Тип> &<Название ссылки> = <Переменная>;

После создания ссылки ее название можно использовать в выражениях вместо названия переменной. Пример использования независимых ссылок приведен в листинге 3.12.

Листинг 3.12. Независимые ссылки

#include <iostream>

int main() {
   int x = 10;
   int &ref = x;                  // Объявление ссылки
   ref = 20;
   std::cout << x << std::endl;   // 20
   x = 30;
   std::cout << ref << std::endl; // 30
   return 0;
}

Особого смысла в применении независимых ссылок нет. Все удобство использования ссылок проявляется при передаче параметров в функцию вместо передачи указателя. В этом случае оператор & указывается перед параметром в объявлении функции. При вызове функции передается не адрес, а значение. Таким образом внутри функции мы работаем с псевдонимом переменной. Пример использования ссылок приведен в листинге 3.13.

Листинг 3.13. Передача параметров с помощью ссылок

#include <iostream>

void func(int &x);

int main() {
   int y = 10;
   func(y);                     // Передаем значение, а не адрес
   std::cout << y << std::endl; // 20 (значение изменилось!!!)
   return 0;
}
void func(int &x) {
   x = x * 2;
}

Согласитесь, что инструкция x = x * 2; выглядит более привлекательно, чем инструкция *x = *x * 2; из листинга 3.11.

Помимо ссылок на значения l-value (обычные переменные) стандарт C++11 позволяет создавать ссылки на значения r-value, например, на литералы или временные объекты, возвращаемые из функции. При объявлении такой ссылки указываются два оператора &:

int &&ref = 7;
std::cout << ref << std::endl; // 7

Обычно временные объекты удаляются при выходе из области видимости, но при использовании ссылок на значения r-value временные объекты будут доступны, пока существует ссылка на них.

С помощью функции move() можно выполнить приведение значения l-value к значению r-value:

int x = 10;
// int &&ref = x;              // Ошибка: x — l-value, а не r-value
int &&ref = std::move(x);      // OK
std::cout << ref << std::endl; // 10

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов