Перегрузка функций, аргументы по умолчанию и рекурсия в C++

Перегрузка функций, аргументы по умолчанию и рекурсия в C++ — три приёма, делающих функции гибче.

Перегрузка — это несколько функций с одним именем, но разными параметрами. Компилятор выбирает нужную по типам аргументов.

Перегрузка функций

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

#include <iostream>
using namespace std;

int square(int x)       { return x * x; }
double square(double x) { return x * x; }

int main() {
    cout << square(5) << "\n";     // вызовется int-версия
    cout << square(2.5) << "\n";   // вызовется double-версия
    return 0;
}

Вывод:

25
6.25

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

Параметру можно задать значение по умолчанию — тогда аргумент при вызове необязателен.

#include <iostream>
#include <string>
using namespace std;

void greet(string name, string greeting = "Привет") {
    cout << greeting << ", " << name << "!\n";
}

int main() {
    greet("Аня");                 // используется значение по умолчанию
    greet("Боб", "Здравствуй");   // значение переопределено
    return 0;
}

Вывод:

Привет, Аня!
Здравствуй, Боб!

Рекурсия

Рекурсивная функция вызывает саму себя. Обязательно нужно условие выхода, иначе вызовы не закончатся.

#include <iostream>
using namespace std;

int factorial(int n) {
    if (n <= 1) return 1;            // база рекурсии
    return n * factorial(n - 1);     // шаг рекурсии
}

int main() {
    cout << factorial(5) << "\n";   // 5*4*3*2*1
    return 0;
}

Вывод:

120

Коротко

  • Перегрузка: одно имя — разные параметры; нужную версию выбирает компилятор.
  • Аргументы по умолчанию делают параметры необязательными; задаются справа налево.
  • Рекурсия = вызов самой себя; всегда нужна база (условие выхода).
Проверьте себя
1. Чем должны различаться перегруженные функции?
AТолько именем
BЧислом или типами параметров
CТипом возвращаемого значения
DНичем
2. Что обязательно для корректной рекурсии?
AЦикл for
BГлобальная переменная
CБаза — условие выхода
DАргумент по умолчанию
3. Что выведет square(2.5) при наличии int- и double-версий?
A6
B6.25
CОшибка компиляции
D4
Поддержать проект