Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

Иначе говоря, любая операция над переменной

r
на самом деле означает операцию над переменной
i
. Ссылки позволяют уменьшить размер выражений. Рассмотрим следующий пример:

vector< vector<double> > v; // вектор векторов чисел типа double

Допустим, нам необходимо сослаться на некоторый элемент

v[f(x)][g(y)]
несколько раз. Очевидно, что выражение
v[f(x)][g(y)]
выглядит слишком громоздко и повторять его несколько раз неудобно. Если бы оно было просто значением, то мы могли бы написать следующий код:

double val = v[f(x)][g(y)]; // val — значение элемента v[f(x)][g(y)]

В таком случае можно было бы повторно использовать переменную

val
. А что, если нам нужно и читать элемент
v[f(x)][g(y)]
, и присваивать ему значения
v[f(x)][g(y)]
? В этом случае может пригодиться ссылка.

double& var = v[f(x)][g(y)]; // var — ссылка на элемент v[f(x)][g(y)]

Теперь можем как считывать, так и изменять элемент

v[f(x)][g(y)]
с помощью ссылки
var
. Рассмотрим пример.

var = var/2+sqrt(var);

Это ключевое свойство ссылок — оно может служить “аббревиатурой” объекта и использоваться как удобный аргумент. Рассмотрим пример.

// передача по ссылке (функция ссылается на полученную переменную)

int f(int& x)

{

x = x+1;

return x;

}

int main

{

int xx = 0;

cout << f(xx) << endl; // вывод: 1

cout << xx << endl; // вывод: 1; функция f изменяет

// значение xx

int yy = 7;

cout << f(yy) << endl; // вывод: 8

cout << yy << endl; // вывод: 8; функция f изменяет

// значение yy

}

Передачу аргументов по ссылке можно проиллюстрировать следующим образом.

Сравните этот пример с соответствующим примером из раздела 8.5.3.

Совершенно очевидно, что передача по ссылке — очень мощный механизм: функции могут непосредственно оперировать с любым объектом, передаваемым по ссылке. Например, во многих алгоритмах сортировки перестановка двух значений — весьма важная операция. Используя ссылки, можем написать функцию, меняющую местами два числа типа
double
.

void swap(double& d1, double& d2)

{

double temp = d1; // копируем значение d1 в переменную temp

d1 = d2; // копируем значение d2 в переменную d1

d2 = temp; // копируем старое значение d1 в переменную d2

}

int main

{

double x = 1;

double y = 2;

cout << "x == " << x << " y== " << y << '\n'; // вывод: x==1 y==2

swap(x,y);

cout << "x == " << x << " y== " << y << '\n'; // вывод: x==2 y==1

}

В стандартной библиотеке предусмотрена функция

swap
для любого типа, который можно скопировать, поэтому его можно применять к любому типу.

8.5.6. Сравнение механизмов передачи параметров по значению и по ссылке

Зачем нужны передачи по значению, по ссылке и по константной ссылке. Для начала рассмотрим один формальный пример.

void f(int a, int& r, const int& cr)

{

++a; // изменяем локальную переменную a

++r; // изменяем объект, с которым связана ссылка r

++cr; // ошибка: cr — константная ссылка

  • Читать дальше
  • 1
  • ...
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: