Программирование. Принципы и практика использования C++ Исправленное издание, стр. 114
void print(vector<double> v) // передача по значению; приемлемо ?{ cout << "{ "; for (int i = 0; i<v.size(); ++i) { cout << v[i]; if (i!=v.size()–1) cout << ", "; } cout << " }\n";}Функцию
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()doubledoubleИтак, нам необходим способ передачи функции
print()void print(const vector<double>& v) // передача по константной ссылке{ cout << "{ "; for (int i = 0; i<v.size(); ++i) { cout << v[i]; if (i!=v.size()–1) cout << ", "; } cout << " }\n";}Символ
&constprint()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()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;}