# Глава 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. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!