Лучшие вопросы
Таймлайн
Чат
Перспективы

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

Из Википедии, свободной энциклопедии

Remove ads

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

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

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

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

Remove ads

Реализация

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

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

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

Remove ads

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

Суммиров вкратце
Перспектива

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

Пример: перегрузки функций в 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» с аргументами, различающимися по типу данных или их количеству.

Пример: перегрузки функций на языке 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);

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

Remove ads

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

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

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

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

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

Remove ads

См. также

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads