Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Особенность некоторых языков программирования
Feature of some programming languages
В компьютерном программировании перегрузка операторов, иногда называемая полиморфизмом "ad hoc" операторов, является частным случаем полиморфизма, когда различные операторы имеют различные реализации в зависимости от типов их аргументов. Перегрузка операторов обычно определяется языком программирования, программистом или и тем, и другим.
In computer programming, operator overloading, sometimes termed operator ad hoc polymorphism, is a specific case of polymorphism, where different operators have different implementations depending on their arguments. Operator overloading is generally defined by a programming language, a programmer, or both.
Критика
Перегрузка операторов часто подвергается критике, поскольку она позволяет программистам переопределять семантику операторов в зависимости от типов их операндов. Например, использование оператора `<<` в C++ в выражении `a << b` сдвигает биты переменной `a` влево на `b` бит, если `a` и `b` имеют целочисленный тип, но если `a` является потоком вывода, то указанный код попытается записать значение `b` в этот поток. Поскольку перегрузка операторов позволяет первоначальному программисту изменить привычную семантику оператора и ввести в заблуждение последующих разработчиков, считается хорошей практикой использовать перегрузку операторов с осторожностью (разработчики Java решили не использовать эту возможность, хотя и не обязательно по этой причине). Другая, более тонкая проблема с операторами заключается в том, что некоторые математические правила могут быть ошибочно ожидаемы или непреднамеренно подразумеваться. Например, свойство коммутативности для оператора `+` (то есть `a + b = b + a`) не всегда применимо; это проявляется, например, при работе со строками, поскольку оператор `+` часто перегружается для выполнения конкатенации строк (то есть `a + b` дает `ab`, а `b + a` дает `ba`). Типичный контраргумент исходит непосредственно из математики: хотя `+` коммутативен для целых чисел (и, в более общем смысле, для любых комплексных чисел), он не коммутативен для других "типов" переменных. На практике, `+` не всегда ассоциативен, например, при работе со значениями с плавающей точкой из-за ошибок округления. Другой пример: в математике умножение коммутативно для действительных и комплексных чисел, но не коммутативно при умножении матриц.
Operator overloading has often been criticized because it allows programmers to reassign the semantics of operators depending on the types of their operands. For example, the use of the operator in C++ a << b shifts the bits in the variable left by bits if and are of an integer type, but if is an output stream then the above code will attempt to write a to the stream. Because operator overloading allows the original programmer to change the usual semantics of an operator and to catch any subsequent programmers by surprise, it is considered good practice to use operator overloading with care (the creators of Java decided not to use this feature, although not necessarily for this reason). Another, more subtle, issue with operators is that certain rules from mathematics can be wrongly expected or unintentionally assumed. For example, the commutativity of + (i. e. that ) does not always apply; an example of this occurs when the operands are strings, since + is commonly overloaded to perform a concatenation of strings (i. e. yields , while yields ). A typical counter to this argument comes directly from mathematics: While + is commutative on integers (and more generally any complex number), it is not commutative for other "types" of variables. In practice, + is not even always associative, for example with floating point values due to rounding errors. Another example: In mathematics, multiplication is commutative for real and complex numbers but not commutative in matrix multiplication.
1980-е годы
Ada поддерживает перегрузку операторов с момента своего появления, с публикацией стандарта языка Ada 83. Однако разработчики языка решили не допускать определение новых операторов. Перегружаться могут только уже существующие в языке операторы, путем определения новых функций с идентификаторами, такими как "+", "*", "&" и т.п. Последующие редакции языка (в 1995 и 2005 годах) сохранили ограничение на перегрузку существующих операторов. В C++ перегрузка операторов реализована более гибко, чем в ALGOL 68.
Ada supports overloading of operators from its inception, with the publication of the Ada 83 language standard. However, the language designers chose to preclude the definition of new operators. Only extant operators in the language may be overloaded, by defining new functions with identifiers such as "+", "*", "&" etc. Subsequent revisions of the language (in 1995 and 2005) maintain the restriction to overloading of extant operators. In C++, operator overloading is more refined than in ALGOL 68.
1990-е годы
Дизайнеры языка Java в Sun Microsystems решили отказаться от перегрузки операторов. Python позволяет перегружать операторы посредством реализации методов с особыми именами. Например, оператор сложения (+) можно перегрузить, реализовав метод. Ruby позволяет перегрузку операторов как синтаксический сахар для простых вызовов методов. Lua позволяет перегружать операторы как синтаксический сахар для вызовов методов, с той дополнительной особенностью, что если первый операнд не определяет данный оператор, будет использован метод второго операнда.
Java language designers at Sun Microsystems chose to omit overloading. Python allows operator overloading through the implementation of methods with special names. For example, the addition (+) operator can be overloaded by implementing the method
Ruby allows operator overloading as syntactic sugar for simple method calls. Lua allows operator overloading as syntactic sugar for method calls with the added feature that if the first operand doesn't define that operator, the method for the second operand will be used.