Перегрузка операторов
Материал из Википедии — свободной энциклопедии
В программировании, перегрузка операторов — определённый случай полиморфизма, в котором некоторые или все операторы, такие как +
, =
или ==
имеют различное значение в зависимости от типов их параметров. Операторы не обязаны всегда быть символами. Иногда перегрузки определены языком, иногда программист может осуществить её для новых типов.
Перегрузка операторов — обычно только «синтаксический сахар». Тем не менее, эта функция полезна, потому что она позволяет разработчику программировать более естественным образом. Также перегрузка операторов делает поведение пользовательских типов более похожим на поведение встроенных. Того же самого эффекта можно добиться, используя функции; к примеру, рассмотрим для целых чисел a
, b
, c
:
a + b × c
В языке, не поддерживающем перегрузку этих операторов, данная операция будет выглядеть приблизительно следующим образом:
operator_add_integers (a, operator_multiply_integers (b,c))
[править] Критика
Перегрузка оператора подвергается критике, потому что позволяет программистам давать операторам полностью различные функциональные возможности в зависимости от типов их операндов. Пример этой проблемы: использование в C++ оператора <<
. Выражение:
a << 1;
возвратит удвоенное значение, если a
является целой переменной. Однако, если a
является выходным потоком, та же строка выведет в этот поток строку «1»
.
Поскольку перегрузка оператора позволяет программисту изменять обычную семантику оператора, обычно считается хорошей практикой использовать её с осторожностью. Программисты, одобряющие перегрузку операторов, обычно отвечают на это, что то же самое относится и к перегрузке функций. Более того, даже в отсутствии перегрузки, программист может определить функцию, которая выполняет совсем не то, что подразумевается в её названии. Другая, более тонкая проблема с операторами — то, что может ожидаться выполнение определённых правил математики. Например, a + b
обычно (но не всегда) означает то же самое, что b + a
, но «один» + «два»
отличается от «два» + «один»
на языках, где оператор +
перегружен для конкатенации строк.
[править] Классификация
Ниже приведена классификация некоторых языков программирования по тому, позволяют ли они перегрузку операторов, и ограничены ли операторы предопределённым набором:
Операторы | Нет перегрузки | Есть перегрузка |
---|---|---|
Ограниченое множество операторов | ||
Возможно определение новых операторов |