31. Перегрузка операторов

В скриптах поддерживается перегрузка операторов, то есть изменение действий, связанных с такими операциями, как сложение, вычитание, умножение и так далее.
Перегрузка операторов возможна только для объектов конкретного класса и делается это при помощи переопределения методов с предопределёнными именами.
Например, в следующем примере для класса gun переопределяется метод opAddAssign, который соответствует оператору += (сложение с присваиванием).
После этого становится возможным прибавлять к gun целое число (в игре такое действие может соответствовать перезарядке оружия):
class gun
{
int ammo = 0;
void opAddAssign (int count)
{
ammo+=count;
}
}

void main ()
{
gun shotgun;

// Добавили десять патронов.
shotgun += 10;
}
Обсуждение того, в каких случаях следует, а в каких не следует использовать механизм перегрузки операторов, не является предметом данной статьи, поэтому ограничимся лишь перечислением доступных для переопределения методов.
Методы, собранные в следующую таблицу, соответствуют унарным операторам.
Эти методы не принимают параметров, а воздействуют на сам объект.
Для наглядности в скобках указаны операции, которые эти операторы реализуют для целых чисел.

Имя метода Оператор
opNeg — (унарный минус )
opCom ~ (инверсия)
opPreInc ++ (префиксный инкремент)
opPreDec — (префиксный инкремент)
opPostInc ++ (постфиксный инкремент)
opPostDec — (постфиксный декремент)
Ниже представлены методы, соответствующие бинарным операторам.
Бинарные операторы требуют двух операндов, но данные методы получают лишь один параметр (это правый операнд), левым операндом является сам объект (в методах с суффиксом _r ситуация обратная — левый операнд передаётся в качестве параметра, а правым является сам объект).
Имя метода Оператор
opAdd и opAdd_r +
opSub и opSub_r
opMul и opMul_r *
opDiv и opDiv_r /
opMod и opMod_r %
opAnd и opAnd_r &
opOr и opOr_r |
opXor и opXor_r ^
opShl и opShl_r <<
opShr и opShr_r >>
opUshr и opUshr_r >>>
Ниже представлены методы, связанные с различными операторами присваивания.
Имя метода Оператор
opAssign = (присвоить значение)
opAddAssign +=
opSubAssign -=
opMulAssign *=
opDivAssign /=
opModAssign %=
opAndAssign &=
opOrAssign |=
opXorAssign ^=
opShlAssign <<=
opShrAssign >>=
opUshrAssign >>>=
Индексный оператор или оператор индексирования обозначается квадратными скобками и представляет собой операцию извлечения элемента массива по указанному индексу.
Чтобы перегрузить оператор индексирования, необходимо определить метод opIndex.
Этот метод получает индекс элемента в качестве единственного параметра и должен вернуть значение, соответствующее этому индексу.
Пример перегрузки оператора индексирования для класса vector:
class vector
{
double x,y,z;
// ...
double& opIndex(int i)
{
if(i==0)
{
return x;
}
else if(i==1)
{
return y;
}
else if(i==2)
{
return z;
}
}
}
В этом примере метод возвращает не просто значение, а ссылку на соответствующую координату вектора.
Это позволяет использовать оператор индексирования для присваивания нового значения соответствующей координате:
vector v;
v[1] = 42;
Для того чтобы перегрузить операторы эквивалентности (== и !=), необходимо определить один метод с именем opEquals.
Метод должен принимать один параметр, который является вторым операндом, и возвращать значение типа bool.
Например:
class commando
{
string callsign;
// ...
bool opEquals (commando@ other) const
{
return this.callsign==other.callsign;
}
}

// Где-нибудь в коде...
if (commando1 != commando2)
{
// Делаем что-нибудь...
}
Для того чтобы перегрузить операторы сравнения (<, <=, > и >=), необходимо определить один метод с именем opCmp.
Этот метод должен принимать один параметр, который является вторым операндом, и возвращать значение типа int в соответствии со следующими правилами:
  • Вернуть 0, если первый и второй операнды совпадают.
  • Вернуть отрицательное число, если первый операнд меньше второго.
  • Вернуть положительное число, если первый операнд больше второго.
Назад | Содержание | Вперёд

Поделитесь с друзьями

WordPress Lessons