Итак, нам необходим способ передачи функции print
void print(const vector
{
cout << "{ ";
for (int i = 0; i
cout << v[i];
if (i!=v.size–1) cout << ", ";
}
cout << " }\n";
}
Символ &
const
предотвращает случайную модификацию аргумента в функции print
. Кроме объявления аргумента, все остальное без изменений. Правда, теперь все операции будут производиться не над копией, а над самим аргументом, полученным по ссылке. Такие аргументы называются ссылками, потому что они ссылаются на объекты, определенные вне функции. Вызов функции print
остается точно таким же, как и раньше.void f(int x)
{
vector
vector
vector
// ...заполняем векторы vd1, vd2, vd3 значениями...
print(vd1);
print(vd2);
print(vd3);
}
Этот механизм можно проиллюстрировать графически.
Константная ссылка обладает полезным свойством: она не позволяет случайно изменить объект, на который ссылается. Например, если мы сделаем глупую ошибку и попытаемся присвоить элементу вектора, полученного извне функции print
void print(const vector
{
// ...
v[i] = 7; // ошибка: v — константа (т.е. не может изменяться)
// ...
}
Передача аргументов по константной ссылке — очень полезный и распространенный механизм. Вернемся к функции my_find
int my_find(vector
// копия
Если вектор содержит тысячи строк, то поиск занял бы заметный объем времени даже на быстром компьютере. Итак, мы можем улучшить функцию my_find
// передача по ссылке: без копирования, доступ только для чтения
int my_find(const vector
8.5.5. Передача параметров по ссылке
А что делать, если мы хотим, чтобы функция модифицировала свои аргументы? Иногда это очень нужно. Например, мы можем написать функцию init
void init(vector
{
for (int i = 0; i
}
void g(int x)
{
vector
vector
vector
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
Иначе говоря, любая операция над переменной r
i
. Ссылки позволяют уменьшить размер выражений. Рассмотрим следующий пример:vector< vector
Допустим, нам необходимо сослаться на некоторый элемент v[f(x)][g(y)]
v[f(x)][g(y)]
выглядит слишком громоздко и повторять его несколько раз неудобно. Если бы оно было просто значением, то мы могли бы написать следующий код: