Константные ссылки
Ссылки полезны, даже когда функция вообще не меняет вектор. При передаче по значению копируется весь вектор со всеми элементами. С пятью числами это не важно, но если в векторе миллион измерений, программа будет копировать миллион чисел при каждом вызове функции. Ссылка не копируется, поэтому передача происходит быстро, каким бы большим ни был вектор.
Но у обычной ссылки есть минус: функция может изменить вектор, даже случайно. А тот, кто читает int total(std::vector<int>& numbers), думает, что функция меняет вектор. Поэтому перед типом добавляют слово const.
const (сокращение от constant, «постоянный») означает, что значение менять нельзя. Его можно использовать и с обычной переменной, если её значение в программе никогда не должно меняться:
#include <iostream>
int main() {
const int rounds = 3;
rounds = 4;
return 0;
}Эта программа не компилируется:
main.cpp:5:12: error: cannot assign to variable 'rounds' with const-qualified type 'const int'Компилятор следит за тем, чтобы в const-переменную никто ничего не присваивал.
Константная ссылка объединяет и то и другое: функция получает вектор без копирования и не может его изменить:
#include <iostream>
#include <vector>
int total(const std::vector<int>& numbers) {
int sum = 0;
for (int number : numbers) {
sum = sum + number;
}
return sum;
}
int main() {
std::vector<int> purchases = {120, 45, 80};
std::cout << "Сумма: " << total(purchases) << std::endl;
return 0;
}Это выводит:
Сумма: 245Читайте параметр const std::vector<int>& numbers как «numbers — ссылка на вектор целых чисел, который нельзя менять». Вектор purchases в main не const: const у параметра действует только внутри функции. Если бы функция попыталась изменить вектор, например через numbers[0] = 0;, компиляция закончилась бы ошибкой cannot assign to return value because function 'operator[]' returns a const value. Для numbers.push_back(5); ошибка такая: no matching member function for call to 'push_back'.
Так какой параметр выбрать?
- Небольшие значения, которые функция только читает (
int,double,char,bool): передавайте по значению,int count. Копировать одно число так же быстро, как передать ссылку. - Векторы и текст, которые функция только читает: передавайте по константной ссылке,
const std::vector<int>& numbers,const std::string& name. Такую функцию можно вызвать и со значением, которого нет в переменной: например, функциюvoid greet(const std::string& name)можно вызвать с текстом в кавычках,greet("Ева"). - Всё, что функция должна менять: передавайте по ссылке без
const,int& score,std::vector<int>& scores.
Задание
- 1
В векторе
stepsлежит количество шагов за каждый день. Функцияtotalтолько читает вектор, но получает его копию. Измените её параметр на константную ссылку. Программа по-прежнему выводитВсего шагов: 38100. - 2
Под функцией
totalнапишите функциюmost, которая тоже принимает вектор по константной ссылке и возвращает его наибольший элемент. Вmain, под первой строкой вывода, выведите текстБольше всего за день:и результатmost(steps). Программа выведетВсего шагов: 38100, а затемБольше всего за день: 12000.