Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

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

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

Полиморфизм
Специальный полиморфизм
Параметрический полиморфизм
Полиморфизм подтипов

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

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

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

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

Реализация

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

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

Чтобы исключить ошибку программиста, давшего случайно имя подпрограмме, которое уже используется, вводится дополнительное требование написания ключевого слова. Так сделано, например, в языке 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» с аргументами, различающимися по типу данных или их количеству.

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

См. также

Эта страница в последний раз была отредактирована 18 апреля 2023 в 12:07.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).