Итоги
В этом уроке вы узнали, что:
- При передаче по значению функция получает копию аргумента. Когда она меняет копию, переменная вызывающего кода остаётся прежней. Это верно и для векторов.
- Ссылка — это другое имя уже существующей переменной. Параметр со знаком
&после типа (int& score,std::vector<int>& scores) позволяет функции менять переменную или вектор, которые вы ей передаёте. Вызов выглядит как обычно, а аргументом должна быть переменная. - Через ссылки функция может отдать сразу несколько результатов или поменять местами две переменные.
- В цикле
for (int number : numbers)переменнаяnumber— это копия элемента. Чтобы менять элементы в цикле, пишитеfor (int& number : numbers)или используйте цикл с индексом. constозначает, что значение менять нельзя. Константная ссылка (const std::vector<int>& numbers,const std::string& name) передаёт вектор или текст без копирования, и функция не может их изменить.- У каждой переменной есть адрес в памяти, который можно получить через
&x. Указатель (int* p = &x;) хранит адрес, а через*pможно читать и менять переменную, на которую он указывает. - В объявлении
&и*входят в тип: это ссылка и указатель. В выражении&x— адрес переменной, а*p— переменная, на которую указывает указатель. - Функцию с параметром
int*вызывают с адресом:addPoint(&score). nullptrозначает, что указатель никуда не указывает. Если указатель может бытьnullptr, проверяйте его перед использованием.- Предпочитайте ссылки. Указатель используйте, когда нужно «ничего» или перенаправление на другую переменную.
На этом все темы курса пройдены. В следующем уроке, итоговом проекте, вы шаг за шагом напишете одну большую программу и используете всё, что знаете из курса: переменные, условия, векторы, циклы, функции и ссылки.
Задание
- 1
Потренируемся. В векторе
scoresлежат результаты теста, и учитель добавляет к каждому из них бонус. Напишите функциюaddBonusс двумя параметрами: векторомscores, который функция меняет, и числомbonus. Функция прибавляет бонус к каждому результату, но ни один результат не должен превышать 100 баллов: всё, что больше, становится100. Вызовите её с бонусом10перед циклом вывода. Программа выведет55,82,100,48и76, по одному числу в строке. - 2
Напишите функцию
findMinMax, которая принимает вектор по константной ссылке и две ссылки наint,lowestиhighest. Она записывает в них наименьший и наибольший результат, то есть «возвращает» сразу два значения. Для начала запишите в обе первый элемент вектора. В концеmainсоздайте две переменные, передайте их в функцию и выведите:Наименьший: 48, наибольший: 100.