Программирование. Принципы и практика использования C++ Исправленное издание, стр. 115
void g(int x){ vector<double> vd1(10); // небольшой вектор vector<double> vd2(1000000); // большой вектор vector<double> vd3(x); // вектор неопределенного размера init(vd1); init(vd2); init(vd3);}Итак, мы хотим, чтобы функция
init()Рассмотрим ссылки более подробно. Ссылка — это конструкция, позволяющая пользователю объявлять новое имя объекта. Например,
int&intint i = 7;int& r = i; // r — ссылка на переменную ir = 9; // переменная i становится равной 9 <div class="fb2-image"><!--[litru_binary]_068.png[/litru_binary]--></div>i = 10;cout << r << ' ' << i << '\n'; // вывод: 10 10Иначе говоря, любая операция над переменной
rivector< 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)]В таком случае можно было бы повторно использовать переменную
valv[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)]varvar = 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.
doublevoid 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. Сравнение механизмов передачи параметров по значению и по ссылке
Зачем нужны передачи по значению, по ссылке и по константной ссылке. Для начала рассмотрим один формальный пример.