Функции в C++ для начинающих. Перегрузка функций

В С++ существует понятие Перегрузка функций.
  • Перегрузка функций — это механизм, который позволяет двум родственным функциям иметь одинаковые имена.
Благодаря возможностям языка С++ программисты, пишущие на этом языке собственные функции, могут давать функциям одинаковые названия.
Простейший вариант, показывающий, что это значит, можно посмотреть на примере функции сложения двух чисел:

При наличии нескольких функций с одинаковыми названиями компилятор С++ может выбирать наиболее совместимую, ориентируясь на уходящие вовнуть функции аргументы. Этот эффект называется перегрузкой функций. Компилятор ориентируется на количество аргументов и на типы каждого уходящего аргумента.
В листинге #1 у нас 3 функции с одинаковым названием sum, а внутри функции main происходит вызов каждой из них. В зависимости от используемых аргументов, срабатывает та функция, которая больше всех подходит.
  • Перегрузка функций избавляет вас от необходимости выдумывать разные названия функциям, решающим схожие по смыслу задачи.
Примером возникновения ситуации, когда может понадобиться перегрузка функций, может оказаться пример написания программы, обрабатывающей массивы:

Мы бы могли использовать 8 названий: 4 для одномерного массива (инициализация, заполнение, вывод, очистка) и 4 для двумерного, но вместо 8 названий мы используем только 4 хорошо говорящих названия.
Благодаря тому, что функциям в С++ можно давать одинаковые имена, нам позволительно использовать одно и то же название для разных функций. В листинге #2 эта возможность активно применяется. Это всё способствует облегчению использования написанных кем-то функций.
Для схожих задач, которые можно именовать одним названием в то время, когда решение этих задач должно быть описано по-разному, — используется перегрузка функций.
Перегрузка функций в С++ срабатывает тогда, когда или количество параметров у перегружаемых функций различно, или когда типы, задаваемые в списке параметров, различаются. В случае одинакового числа параметров типы параметров у перегружаемых функций должны различаться.
Если и количество параметров совпадает, и число этих параметров в двух функциях одинаково, то тогда считается, что это просто дублирование функции. Такой дубль не имеет смысла, и компилятор не даст вам запустить код. Если бы такой код можно было собрать, то компилятор бы просто не знал, какую из функций следовало бы выбрать. Это вам должно быть понятно на интуитивном уровне:

В этом показанном коде и число параметров функции одинаково: 1 параметр, — и тип этих параметров совпадает (в обоих случаях int). В таком случае перегрузки не произойдёт. Нужно или изменить тип, или добавить параметров, чтобы получить возможность перегрузки.
  • Если тип уходящего в функцию аргумента может быть неявно приведён к типу параметра, принимающего аргумент, то тогда типы параметров могут неполностью совпадать с типами аргументов.

Вследствие того, что в С++ имеют место неявные приведения, из типа аргумента, ушедшего вовнутрь функции, легко выводится тип, заявленный в параметре, принимающем входящий в функцию аргумент, этот код срабатывает, но в вычислении происходит арифметическая ошибка. Вам нужно быть внимательными к неявным преобразованиям. Компилятор выбирает наилучшее соответствие, поэтому написание функции с заведомо правильными типами может легко исправить ситуацию:

Всё зависит от типов аргументов, отдаваемых функции, и количества этих аргументов. Компилятор не смотрит на порядок написания, а просто ищет наилучшее соответствие аргументов и типов.
Подводим итоги:
  • Перегруженными функциями называют функции, имеющие одинаковые названия.
  • Механизм работы, позволяющий описывать разные функции и давать этим разным функциям одинаковое название — называется перегрузкой функций.
  • Перегрузка работает только в том случае, если в разных функциях или количество параметров разное, или типы параметров разные. Если количество параметров одинаковое, но типы для них заявлены разные, то тогда перегрузка сработает.
  • Какая из перегруженных функций сработает — зависит от типов аргументов, отдаваемых в функцию. Компилятор выбирает наиболее подходящую по типам функцию.
  • Если компилятор находит наилучший вариант функции, то эта функция и срабатывает.
  • Компилятор может найти несколько одновременно подходящих функций, тогда возникает неоднозначность выбора: компилятор не может выбрать из нескольких, происходит ошибка. Код не компилируется. Ошибка неоднозначности (ambiquous all)
  • Компилятор может вообще не найти подходящей функции. Код не компилируется. Ошибка соответствия (no match).
Вам нужно понять, что использование перегрузки функций — это ни что иное, как использование одного названия для описания множества функций. И запомнить, что перегрузка возможна, если параметры отличаются или своим количеством, или завленными для них типами. А ещё зарубить себе на носу, что какая из функций будет срабатывать зависит от соответствия уходящих в функцию аргументов и параметров, принимающих эти аргументы.

5 комментариев на «“Функции в C++ для начинающих. Перегрузка функций”»

  1. Татьяна:

    Большое спасибо за доступное изложение материала! 😛

  2. WolfGrin:


    Код не работает — ошибка: error C2668: ‘sum’ : ambiguous call to overloaded function
    насколько я понял, константы 5.0 и 6.0 которые передаются в функции, компилятор определяет как double, а поскольку функии принимающей в параметрах double нет, компилятор пытается преобразовать в другой подходящий тип — int или float, да вот не может выбрать в какой лучше. Если задать хоть один аргумент явно int или float, проблем не будет.

    Автор сайта отвечает:
    Всё так и есть. Можно еще дописывать дополнительную функцию для double или же просто использовать приведение прямо в момент передачи в функцию.
    myfunc(5.f,6.f);

  3. Аноним:

    Или опечатка или ошибка — там, где впервые суммируются 100.3 и 220.3 получится 320.3 (220.3 приведется к int=220), а во втором 320.6

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/mihail-flenov/bibliya-c-4575419/?lfrom=15589587
Яндекс.Метрика