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

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

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

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

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

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

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

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

  • Татьяна говорит:

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




    0



    0
  • Gen говорит:

    Спасибо!




    0



    0
  • Аноним говорит:

    А какие библиотеки при этом подключаются?
    никаких новых библиотек

    Автор сайта отвечает:
    никаких новых библиотек




    0



    0
    • 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);




      0



      0

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

Ваш e-mail не будет опубликован.

Поиск

 
     

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

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- Сынок, сходи в магазин? - А волшебное слово? - Отключу интернет! - Уже бегу!

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок