# Глава 5.1. Перегрузка функций
Краткая экскурсия по C++ заняла бы _целую книгу._ Мы пробежимся только по основным возможностям языка. Они не уникальны для C++, но без них современный C++ невообразим. Позже каждая тема будет раскрыта подробнее. А пока вы познакомитесь с известными фишками C++ и научитесь их применять на базовом уровне.
## Что такое перегрузка
В C++ допустима перегрузка функций (overloading) — заведение функций с одинаковыми именами, но разным набором параметров. Перегрузка есть во многих языках, например Kotlin, C#, TypeScript и Swift. А Си, Python и Rust не поддерживают перегрузку.
При перегрузке отличаться могут:
- типы параметров,
- количество параметров.
Так выглядят две перегрузки функции `log_error()`:
```cpp {.example_for_playground .example_for_playground_001}
void log_error(std::size_t error_code)
{
std::println("Error. Code: {}", error_code);
}
void log_error(std::size_t error_code, std::string message)
{
std::println("Error. Code {}: {}", error_code, message);
}
int main()
{
log_error(404);
log_error(404, "not found");
}
```
```
Error. Code: 404
Error. Code 404: not found
```
Компилятор выбирает подходящую перегрузку функции на основе типа и количества переданных аргументов. Поэтому нельзя завести функцию, отличающуюся _только_ возвращаемым типом. Это ограничение действует для обычных функций, но не распространяется на шаблонные. О них вы скоро узнаете.
Перегруженные функции _могут_ возвращать значения разных типов, если есть отличия в наборе параметров.
Какие перегрузки функций конфликтуют между собой? Перечислите номера строк через пробел. {.task_text}
```
1 int handle_response(int status, std::string raw_body)
2 bool handle_response(std::string raw_body)
3 int handle_response(std::string encoded_body)
4 int handle_response(int status)
```
```consoleoutput {.task_source #cpp_chapter_0051_task_0010}
```
Функции 2 и 3 отличаются именем параметра и типом возвращаемого значения. На основании только этого невозможно создать перегрузку. {.task_hint}
```cpp {.task_answer}
2 3
```
## Зачем нужна перегрузка
Перегрузка избавляет от придумывания разных имён функций, которые делают практически одно и то же, но для разных параметров. Это упрощает кодовую базу.
Перегрузка функций — один из видов статического полиморфизма. [Полиморфизм](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)) — это способность одного и того же интерфейса проявлять разное поведение. В случае с функциями — это способность функции обрабатывать данные разных типов. Причем перегрузка функций относится именно к _статическому_ полиморфизму. Ведь решение о том, какую из перегрузок вызвать, принимается на этапе компиляции, а во время работы программы, то есть динамически.
Напишите две перегрузки функции `area()` для расчета площади геометрической фигуры. {.task_text}
Первая перегрузка принимает параметр типа `double` — радиус круга `r`. Формула площади круга: `pi * r * r`. {.task_text}
Вторая перегрузка принимает два параметра типа `double`: основание `a` и высоту `h` треугольника. Формула площади треугольника: `0.5 * a * h`. {.task_text}
Число pi выглядит так: `std::numbers::pi`. Это константа, определенная в пространстве имён `numbers`, которое вложено в пространство имён `std`. О том, что такое пространство имен, вы скоро узнаете.
```cpp {.task_source #cpp_chapter_0051_task_0020}
// Перегрузка для площади круга
// Перегрузка для площади треугольника
```
Обе перегрузки возвращают тип `double`. Перегрузка для круга: `double area(double r) { /* ... */ }`. {.task_hint}
```cpp {.task_answer}
double area(double r)
{
return std::numbers::pi * r * r;
}
double area(double a, double h)
{
return 0.5 * a * h;
}
```
----------
## Резюме
- Перегрузка — это создание функций с одинаковым именем и разным набором параметров.
- Перегрузка только по типу возвращаемого значения невозможна.
- Перегрузка полезна, если у вас есть несколько функций, которые выполняют схожие действия над разными данными.
- Перегрузка функций — это вид статического полиморфизма.
Наша группа в telegram. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!