Введение

Особенность некоторых языков программирования

В компьютерном программировании перегрузка операторов, иногда называемая полиморфизмом "ad hoc" операторов, является частным случаем полиморфизма, когда различные операторы имеют различные реализации в зависимости от типов их аргументов. Перегрузка операторов обычно определяется языком программирования, программистом или и тем, и другим.

Критика

Перегрузка операторов часто подвергается критике, поскольку она позволяет программистам переопределять семантику операторов в зависимости от типов их операндов. Например, использование оператора `<<` в C++ в выражении `a << b` сдвигает биты переменной `a` влево на `b` бит, если `a` и `b` имеют целочисленный тип, но если `a` является потоком вывода, то указанный код попытается записать значение `b` в этот поток. Поскольку перегрузка операторов позволяет первоначальному программисту изменить привычную семантику оператора и ввести в заблуждение последующих разработчиков, считается хорошей практикой использовать перегрузку операторов с осторожностью (разработчики Java решили не использовать эту возможность, хотя и не обязательно по этой причине). Другая, более тонкая проблема с операторами заключается в том, что некоторые математические правила могут быть ошибочно ожидаемы или непреднамеренно подразумеваться. Например, свойство коммутативности для оператора `+` (то есть `a + b = b + a`) не всегда применимо; это проявляется, например, при работе со строками, поскольку оператор `+` часто перегружается для выполнения конкатенации строк (то есть `a + b` дает `ab`, а `b + a` дает `ba`). Типичный контраргумент исходит непосредственно из математики: хотя `+` коммутативен для целых чисел (и, в более общем смысле, для любых комплексных чисел), он не коммутативен для других "типов" переменных. На практике, `+` не всегда ассоциативен, например, при работе со значениями с плавающей точкой из-за ошибок округления. Другой пример: в математике умножение коммутативно для действительных и комплексных чисел, но не коммутативно при умножении матриц.

1980-е годы

Ada поддерживает перегрузку операторов с момента своего появления, с публикацией стандарта языка Ada 83. Однако разработчики языка решили не допускать определение новых операторов. Перегружаться могут только уже существующие в языке операторы, путем определения новых функций с идентификаторами, такими как "+", "*", "&" и т.п. Последующие редакции языка (в 1995 и 2005 годах) сохранили ограничение на перегрузку существующих операторов. В C++ перегрузка операторов реализована более гибко, чем в ALGOL 68.

1990-е годы

Дизайнеры языка Java в Sun Microsystems решили отказаться от перегрузки операторов. Python позволяет перегружать операторы посредством реализации методов с особыми именами. Например, оператор сложения (+) можно перегрузить, реализовав метод. Ruby позволяет перегрузку операторов как синтаксический сахар для простых вызовов методов. Lua позволяет перегружать операторы как синтаксический сахар для вызовов методов, с той дополнительной особенностью, что если первый операнд не определяет данный оператор, будет использован метод второго операнда.