Перегрузка процедур и функций
Перегрузка процедур и функций — возможность использования одноимённых подпрограмм: процедур или функций в языках программирования.
Содержание |
Причина появления [править]
В большинстве ранних языков программирования, для упрощения процесса трансляции существовало ограничение, согласно которому одновременно в программе не может быть доступно более одной процедуры с одним и тем же именем. В соответствии этому ограничению, все подпрограммы, видимые в данной точке программы, должны иметь различные имена.
Имена и обозначения процедур и функций, являющихся частью языка программирования, не могут быть использованы программистом для именования собственных подпрограмм.
Реализация [править]
Для того, чтобы иметь возможность использовать несколько вариантов подпрограммы с одним и тем же именем, но с разным числом аргументов или другими типами аргументов (то есть с разной сигнатурой) и вводится перегрузка подпрограмм. Такая перегрузка возможна в рамках процедурной парадигмы, без применения объектно-ориентированного программирования.
При трансляции происходит контроль одноимённых процедур и функций, чтобы они различались по сигнатуре, так как в этом случае транслятор может однозначно определить вызов нужной подпрограммы.
Чтобы исключить ошибку программиста давшему случайно имя подпрограмме, которое уже используется, вводится дополнительное требование написания ключевого слова. Так сделано, например в языке Delphi (ключевое слово overload).
Правила перегрузки функции [править]
Перегружаемые функции имеют одинаковое имя, но разное количество или типы аргументов. Это разновидность статического полиморфизма, при которой вопрос о том, какую из функций вызвать, решается по списку ее аргументов. Этот подход применяется в статически типизированных языках, которые проверяют типы аргументов при вызове функции. Перегруженная функция фактически представляет собой несколько разных функций, и выбор подходящей происходит на этапе компиляции. Перегрузку функций не следует путать с формами полиморфизма, где правильный метод выбирается во время выполнения, например, посредством виртуальных функций, а не статически.
Пример: перегрузки функций в C + +
main() { cout<<volume(10); cout<<volume(2.5,8); cout<<volume(100,75,15); } // volume of a cube int volume(int s) { return(s*s*s); } // volume of a cylinder double volume(double r,int h) { return(3.14*r*r*h); } // volume of a cuboid long volume(long l,int b,int h) { return(l*b*h); }
В приведенном выше примере, объем различных компонентов рассчитывается с использованием тех же вызов функции "volume", с аргументами, различающихся по типу данных или количеству.
Конструктор перегрузки [править]
Конструкторы, используемые для создания экземпляров объектов, также могут быть перегружены в некоторых объектно-ориентированных языках программирования . Потому что во многих языках название конструктора предопределено именем класса, казалось бы, что может быть только один конструктор. Всякий раз, когда несколько конструкторов нужны, они реализованы в виде перегруженных функций. Конструктор по умолчанию не принимает параметров, экземпляр объекта члены с нулевым значением. [ 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 язвка С++, функции с переменным колличетсвом аргументов переопределена перегрузкой для часто используемых вариантов.
См. также [править]
- Процедурное программирование
- Переопределение метода
- Перегрузка операторов
- Полиморфизм (программирование)
Для улучшения этой статьи желательно?:
|

