Перейти к содержимому
Теория · Функции · урок 9 из 13

Аргументы по умолчанию

Когда вы заказываете кофе и не называете размер, бариста делает средний. Размер всё равно есть у каждого заказа, но чаще всего он один и тот же, и повторять его не нужно. Захотите большой — скажете об этом сами.

Функциям тоже бывает нужен параметр, который почти всегда получает одно и то же значение. Например, power возводит число в степень, и чаще всего это квадрат.

Значение на случай пропуска

Параметру можно задать аргумент по умолчанию — значение, которое компилятор подставит, если в вызове этого аргумента нет. Его пишут в списке параметров после знака =:

C++
#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
}

Давайте разберём оба вызова:

  1. power(5): второго аргумента нет, и компилятор превращает вызов в power(5, 2). Цикл дважды умножает result на 5, и получается 25.
  2. power(2, 10): второй аргумент указан, и значение по умолчанию не нужно. 2 в десятой степени — 1024.

Подстановку делает компилятор, когда читает вызов. Сама функция одна, и внутри неё exp всегда получает значение: либо из вызова, либо по умолчанию.

Не путать с перегрузкой

Похожего поведения можно добиться перегрузкой: написать power(int base) и power(int base, int exp). Но тогда функций две, и тело придётся повторить или вызвать одну из другой.

С аргументом по умолчанию функция одна, а вызвать её можно с одним аргументом или с двумя. Если версии должны работать по-разному, нужна перегрузка. Если отличается только значение параметра, хватит аргумента по умолчанию.

Частая ошибка

Значение по умолчанию задают параметру, за которым идёт параметр без такого значения:

C++
int power(int base = 2, int exp);  // ✗
TEXT
error: missing default argument on parameter 'exp'

Это ошибка компилятора: после параметра со значением по умолчанию все следующие тоже должны его иметь. Иначе по вызову power(3) не понять, какой параметр получил 3. Аргументы в вызове сопоставляются с параметрами слева направо, поэтому пропустить можно только последние.

Перенесите параметры со значениями по умолчанию в конец списка.

Главное

  • Аргумент по умолчанию — значение, которое компилятор подставит, если вызов его не передал: int exp = 2.
  • Вызов power(5) компилятор превращает в power(5, 2); функция при этом одна.
  • Параметры со значениями по умолчанию стоят в конце списка: после такого параметра все следующие тоже должны его иметь.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом