Аргументы по умолчанию
Когда вы заказываете кофе и не называете размер, бариста делает средний. Размер всё равно есть у каждого заказа, но чаще всего он один и тот же, и повторять его не нужно. Захотите большой — скажете об этом сами.
Функциям тоже бывает нужен параметр, который почти всегда получает одно и то же значение. Например, power возводит число в степень, и чаще всего это квадрат.
Значение на случай пропуска
Параметру можно задать аргумент по умолчанию — значение, которое компилятор подставит, если в вызове этого аргумента нет. Его пишут в списке параметров после знака =:
#include <iostream>
int power(int base, int exp = 2) {
int result = 1;
for (int i = 0; i < exp; ++i) {
result *= base;
}
return result;
}
int main() {
std::cout << power(5) << ' ' << power(2, 10) << '\n'; // 25 1024
}Давайте разберём оба вызова:
power(5): второго аргумента нет, и компилятор превращает вызов вpower(5, 2). Цикл дважды умножаетresultна5, и получается25.power(2, 10): второй аргумент указан, и значение по умолчанию не нужно.2в десятой степени —1024.
Подстановку делает компилятор, когда читает вызов. Сама функция одна, и внутри неё exp всегда получает значение: либо из вызова, либо по умолчанию.
Не путать с перегрузкой
Похожего поведения можно добиться перегрузкой: написать power(int base) и power(int base, int exp). Но тогда функций две, и тело придётся повторить или вызвать одну из другой.
С аргументом по умолчанию функция одна, а вызвать её можно с одним аргументом или с двумя. Если версии должны работать по-разному, нужна перегрузка. Если отличается только значение параметра, хватит аргумента по умолчанию.
Частая ошибка
Значение по умолчанию задают параметру, за которым идёт параметр без такого значения:
int power(int base = 2, int exp); // ✗error: missing default argument on parameter 'exp'Это ошибка компилятора: после параметра со значением по умолчанию все следующие тоже должны его иметь. Иначе по вызову power(3) не понять, какой параметр получил 3. Аргументы в вызове сопоставляются с параметрами слева направо, поэтому пропустить можно только последние.
Перенесите параметры со значениями по умолчанию в конец списка.
Главное
- Аргумент по умолчанию — значение, которое компилятор подставит, если вызов его не передал:
int exp = 2. - Вызов
power(5)компилятор превращает вpower(5, 2); функция при этом одна. - Параметры со значениями по умолчанию стоят в конце списка: после такого параметра все следующие тоже должны его иметь.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.