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

(перенаправлено с «Перегрузка функций»)

Перегрузка процедур и функций — возможность использования одноимённых подпрограмм: процедур или функций в языках программирования.

Причина появления

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

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

Реализация

Для того чтобы иметь возможность использовать несколько вариантов подпрограммы с одним и тем же именем, но с разным числом аргументов или другими типами аргументов (то есть с разной сигнатурой, так как список аргументов — часть сигнатуры), вводится перегрузка подпрограмм. Такая перегрузка возможна в рамках процедурной парадигмы, без применения объектно-ориентированного программирования.

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

Чтобы исключить ошибку программиста, давшего случайно имя подпрограмме, которое уже используется, вводится дополнительное требование написания ключевого слова. Так сделано, например, в языке Delphi (ключевое слово overload).

Правила перегрузки функции

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

Пример: перегрузки функций в C++

main(){    cout<<volume(10);    cout<<volume(2.5,8);    cout<<volume(100,75,15);} // volume of a cubeint volume(int s){    return(s*s*s);} // volume of a cylinderdouble volume(double r,int h){    return(3.14*r*r*h);} // volume of a cuboidlong volume(long l,int b,int h){    return(l*b*h);}

В приведенном выше примере объем различных компонентов рассчитывается с использованием вызовов разных функций «volume» с аргументами, различающимися по типу данных или их количеству.

Пример: перегрузки функций на языке Nim.

proc overload(x: int)=  echo "string int"proc overload(x: float)=  echo "string float"overload(1) # напечатает "string int"overload(1.1) # напечатает "string float"

Перегрузка конструктора

Конструкторы, используемые для создания экземпляров объектов, также могут быть перегружены в некоторых объектно-ориентированных языках программирования. Из-за того, что во многих языках название конструктора предопределено именем класса, может показаться, что может существовать только один конструктор. Всякий раз, когда требуются несколько конструкторов, они реализованы в виде перегруженных функций. Конструктор по умолчанию не принимает параметров, экземпляр объекта — члены с нулевым значением. [ 1 ] Например, конструктор по умолчанию для объекта bill в ресторане написана на C++ может установить Tip до 15 %:

Bill(){     tip = 15.0;     total = 0.0; }

Недостатком является то, что он делает два шага, чтобы изменить значение созданного Bill объекта. Ниже показано создание и изменение значений в рамках основной программы:

Bill cafe;cafe.tip = 10.00;cafe.total = 4.00;

Через перегрузку конструктора можно было бы передать чаевые и общем качестве параметров при создании. Пример показывает перегруженный конструктор с двумя параметрами:

Bill(double setTip, double setTotal){     tip = setTip;     total = setTotal; }

Теперь функция, которая создает новый объект Bill, может передавать два значения в конструктор и устанавливать элементы данных в один шаг. Ниже показано создание и установка значений:

Bill cafe(10.00, 4.00);

Это может быть полезно для повышения эффективности программ и уменьшения размера кода.

Предостережения

Многократная перегрузка процедуры или функции может затруднить разработчикам понимание, какая из перегрузок в какой момент используется.

Ресурсоёмкость

Возможность перегрузки имён процедур и функций в программе определяется возможностями синтаксического анализа компилятора и требованиями стандарта языка их написания. Синтаксический анализ заключается в сопоставлении вызова перегруженной функции с конкретной функцией (с конкретной сигнатурой) и не влияет на ресурсоёмкость программы и время её выполнения.

Размер откомпилированного кода программы при использовании перегрузки функции вместо функции с произвольным количеством аргументов увеличивается (вместо одной процедуры с переменным количеством аргументов компилируется несколько, для конкретного количества), но взамен увеличивается и производительность программы при вызове процедуры, которая описана как перегруженная (не производится анализ типов и других вычислительных операций во время выполнения программы). Так, например, в библиотеке STL языка C++ часто используемые функции с переменным количеством аргументов заменены перегрузками.

См. также

🔥 Top keywords: Заглавная страницаЯндексДуров, Павел ВалерьевичСлужебная:ПоискYouTubeЛунин, Андрей АлексеевичПодносова, Ирина ЛеонидовнаВКонтактеФоллаут (телесериал)WildberriesTelegramРеал Мадрид (футбольный клуб)Богуславская, Зоя БорисовнаДуров, Валерий СемёновичРоссияXVideosСписок умерших в 2024 годуЧикатило, Андрей РомановичFallout (серия игр)Список игроков НХЛ, забросивших 500 и более шайбПопков, Михаил ВикторовичOzon17 апреляИльин, Иван АлександровичMail.ruСёгун (мини-сериал, 2024)Слово пацана. Кровь на асфальтеПутин, Владимир ВладимировичЛига чемпионов УЕФАГагарина, Елена ЮрьевнаБишимбаев, Куандык ВалихановичЛига чемпионов УЕФА 2023/2024Турнир претендентов по шахматам 2024Манчестер СитиMGM-140 ATACMSРоссийский миротворческий контингент в Нагорном КарабахеЗагоризонтный радиолокаторПинапВодительское удостоверение в Российской Федерации