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

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

Шрифт:

}

cout << " }\n";

}

Символ

&
означает ссылку, а ключевое слово
const
предотвращает случайную модификацию аргумента в функции
print
. Кроме объявления аргумента, все остальное без изменений. Правда, теперь все операции будут производиться не над копией, а над самим аргументом, полученным по ссылке. Такие аргументы называются ссылками, потому что они ссылаются на объекты, определенные вне функции. Вызов функции
print
остается точно таким же, как и раньше.

void f(int x)

{

vector<double> vd1(10); // небольшой вектор

vector<double> vd2(1000000); // большой вектор

vector<double> vd3(x); // вектор неопределенного размера

// ...заполняем векторы vd1, vd2, vd3 значениями...

print(vd1);

print(vd2);

print(vd3);

}

Этот механизм можно проиллюстрировать графически.

Константная ссылка обладает полезным свойством: она не позволяет случайно изменить объект, на который ссылается. Например, если мы сделаем глупую ошибку и попытаемся присвоить элементу вектора, полученного извне функции

print
, какое-то значение, то компилятор сразу выдаст сообщение об этом.

void print(const vector<double>& v) // передача по константной ссылке

{

// ...

v[i] = 7; // ошибка: v — константа (т.е. не может изменяться)

// ...

}

Передача аргументов по константной ссылке — очень полезный и распространенный механизм. Вернемся к функции

my_find
(см. раздел 8.5.1), выполняющей поиск строки в векторе строк. Передача по значению здесь была бы слишком неэффективной.

int my_find(vector<string> vs, string s); // передача по значению:

// копия

Если вектор содержит тысячи строк, то поиск занял бы заметный объем времени даже на быстром компьютере. Итак, мы можем улучшить функцию

my_find
, передавая ее аргументы по константной ссылке.

// передача по ссылке: без копирования, доступ только для чтения

int my_find(const vector<string>& vs, const string& s);

8.5.5. Передача параметров по ссылке

А что делать, если мы хотим, чтобы функция модифицировала свои аргументы? Иногда это очень нужно. Например, мы можем написать функцию

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

void init(vector<double>& v) // передача по ссылке

{

for (int i = 0; i<v.size; ++i) v[i] = i;

}

void g(int x)

{

vector<double> vd1(10); // небольшой вектор

vector<double> vd2(1000000); // большой вектор

vector<double> vd3(x); // вектор неопределенного размера

init(vd1);

init(vd2);

init(vd3);

}

Итак, мы хотим, чтобы функция

init
изменяла вектор, являющийся ее аргументом. Иначе говоря, мы хотим не копировать его (т.е. передавать по значению), не объявлять с помощью константной ссылки (т.е. передавать по константной ссылке), а просто передать обычную ссылку на вектор.

Рассмотрим ссылки более подробно. Ссылка — это конструкция, позволяющая пользователю объявлять новое имя объекта. Например,

int&
— это ссылка на переменную типа
int
. Это позволяет нам написать следующий код:

int i = 7;

int& r = i; // r — ссылка на переменную i

r = 9; // переменная i становится равной 9

i = 10;

cout << r << ' ' << i << '\n'; // вывод: 10 10

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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