Подтвердить что ты не робот

Почему функция перегрузки добавлена ​​в С++?

У меня есть фон C. Мне просто интересно, почему функция перегрузки добавлена ​​в С++? C не имеет перегрузки функций, но С++ делает, что нужно для этого?

Что в тот момент перешло в голову дизайнера языка?

4b9b3361

Ответ 1

Повышает ремонтопригодность. Если у вас есть тип T, и вы вызываете с ним функцию, вам нужно изменить T, если функция была перегружена для нового T, тогда вы можете перекомпилировать мгновенно. В C вам нужно будет вернуться и прорвать все сайты вызовов и изменить вызываемую функцию. Возьмите sqrt(). Если вы хотите использовать sqrt() float, вам нужно перейти на sqrtf().

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

Например, сравните библиотеки строк C и С++. Библиотека строк C предлагает один метод добавления к строке - strcat(). С++ std::string:: append имеет восемь перегрузок. Что вы хотите назвать? append_a, append_b и т.д.? Это смешно - все они выполняют одну и ту же функцию, по-разному.

Изменить: На самом деле стоит упомянуть, что append - очень плохой пример, многие из перегрузок строк С++ очень избыточны. Однако это более общий случай, чем это, и не все избыточные избыточные.

Ответ 2

Одна из веских причин, в дополнение к тому, что сказал DeadMG, заключается в том, что если вы пишете функцию шаблона, например, вызывает sqrt, тогда вам нужен общий способ вызова sqrt - было бы очень сложно, если бы вам пришлось попробовать и каким-то образом изменить имя на sqrtf, sqrtd и т.д., в зависимости от типа параметр шаблона. Перегрузка решает эту проблему, потому что тогда вы просто пишете sqrt и дайте компилятору понять, какую перегрузку он должен использовать:

template <typename T>
T sqrt_plus_one(T t) // contrived example
{
  return sqrt(t) + 1;
}

Ответ 3

Вы предпочитаете "выбирать" один из abs/labs/llabs/fabs/fabsf/fabsl Или просто abs()?

Очевидно, abs().

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

Ответ 4

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

Я не буду рассказывать историю здесь, но упомянул пару интересных исторических фактов:

  • Операция
  • и перегрузка функций тесно связаны;
  • в начале С++ раньше использовалось специальное ключевое слово (overload), которое должно было использоваться для объявления идентификатора как перегруженного;
  • Перегрузка функций требует привязки к типу (например, смены имени); когда он был впервые реализован, он помог обнаружить удивительное количество ошибок времени в существующем коде C и С++ (чтобы процитировать Stroustrup, это было похоже на "запуск lint в программе C в первый раз - несколько смущающий".)

Ответ 5

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

std::string foo = "bar";
std::vector< std::string > myStringVector;
myStringVector.push_back( std::string() );
myStringVector.push_back( std::string( "hello" ) );
myStringVector.push_back( std::string( foo ) );

Разумный пример, но он иллюстрирует точку.

Еще одним моментом будет программирование шаблонов. Вы не могли придумать общие шаблоны, если бы у вас было другое имя функции для каждого типа параметра.

Ответ 6

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