Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Возможности некоторых языков программирования
Capability of some programming languages
В некоторых языках программирования перегрузка функций или перегрузка методов – это возможность создания нескольких функций с одним и тем же именем, но с разными реализациями. Вызов перегруженной функции будет выполнять конкретную реализацию, соответствующую контексту вызова, позволяя одному вызову функции выполнять различные задачи в зависимости от контекста. Например, `function1()` и `function2()` – перегруженные функции. Для вызова второй функции необходимо передать объект в качестве параметра, в то время как первая не требует параметров и вызывается без них. Распространенной ошибкой является присвоение объекту значения по умолчанию во второй функции, что приведет к ошибке неоднозначного вызова, поскольку компилятор не сможет определить, какой из двух методов использовать. Другой пример – функция `print()`, которая выполняет разные действия в зависимости от того, печатает ли она текст или фотографии. Эти две разные функции могут быть перегружены, например, как `print(text)` и `print(photo)`. Если мы напишем перегруженные функции печати для всех объектов, которые наша программа будет "печатать", нам не придется беспокоиться о типе объекта, и правильный вызов функции будет выполнен автоматически. Вызов всегда будет выглядеть как `print(object)`.
In some programming languages, function overloading or method overloading is the ability to create multiple functions of the same name with different implementations. Calls to an overloaded function will run a specific implementation of that function appropriate to the context of the call, allowing one function call to perform different tasks depending on context. For example, and are overloaded functions. To call the latter, an object must be passed as a parameter, whereas the former does not require a parameter, and is called with an empty parameter field. A common error would be to assign a default value to the object in the second function, which would result in an ambiguous call error, as the compiler wouldn't know which of the two methods to use. Another example is a function that executes different actions based on whether it's printing text or photos. The two different functions may be overloaded as If we write the overloaded print functions for all objects our program will "print", we never have to worry about the type of the object, and the correct function call again, the call is always: .
Осложнения
Две проблемы взаимодействуют и усложняют перегрузку функций: маскировка имени (из-за области видимости) и неявное преобразование типов. Если функция объявлена в одной области видимости, а затем другая функция с тем же именем объявлена во вложенной области видимости, существует два естественных возможных варианта поведения при перегрузке: вложенная декларация скрывает внешнюю декларацию (независимо от сигнатуры), или обе декларации – и вложенная, и внешняя – включаются в набор перегруженных функций, при этом вложенная декларация скрывает внешнюю только в случае совпадения сигнатур. В C++ реализован первый вариант: «в C++ перегрузка не распространяется на разные области видимости». Следовательно, чтобы получить набор перегруженных функций, объявленных в разных областях видимости, необходимо явно импортировать функции из внешней области видимости во внутреннюю с помощью ключевого слова. Неявное преобразование типов усложняет перегрузку функций, поскольку если типы параметров не точно соответствуют сигнатуре одной из перегруженных функций, но могут быть приведены к ней посредством преобразования типов, разрешение неоднозначности зависит от того, какое преобразование типов будет выбрано. Эти факторы могут приводить к запутанным ситуациям: неточное совпадение, объявленное во вложенной области видимости, может скрывать точное совпадение, объявленное во внешней области видимости, например.
Two issues interact with and complicate function overloading: Name masking (due to scope) and implicit type conversion. If a function is declared in one scope, and then another function with the same name is declared in an inner scope, there are two natural possible overloading behaviors: the inner declaration masks the outer declaration (regardless of signature), or both the inner declaration and the outer declaration are both included in the overload, with the inner declaration masking the outer declaration only if the signature matches. The first is taken in C++: "in C++, there is no overloading across scopes." As a result, to obtain an overload set with functions declared in different scopes, one needs to explicitly import the functions from the outer scope into the inner scope, with the keyword. Implicit type conversion complicates function overloading because if the types of parameters do not exactly match the signature of one of the overloaded functions, but can match after type conversion, resolution depends on which type conversion is chosen. These can combine in confusing ways: An inexact match declared in an inner scope can mask an exact match declared in an outer scope, for instance.