Следует также подчеркнуть, что когда отдельные координаты точек складываются в операторе operators+()
, то в результате такого сложения получаются целые значения, поскольку отдельные координаты х, у и z представлены целыми величинами. Но сама перегрузка оператора + для объектов типа ThreeD
не оказывает никакого влияния на операцию сложения целых значений, т.е. она не меняет первоначальное назначение этого оператора.
А теперь проанализируем операторный метод operator-()
. Оператор - действует так же, как и оператор +, но для него важен порядок следования операндов. Напомним, что сложение носит коммутативный характер (от перестановки слагаемых сумма не меняется), чего нельзя сказать о вычитании: А - В
не то же самое, что и В - А
! Для всех двоичных операторов первым параметром операторного метода является левый операнд, а вторым параметром — правый операнд. Поэтому, реализуя перегружаемые варианты некоммутативных операторов, следует помнить, какой именно операнд должен быть указан слева и какой — справа.
Перегрузка унарных операторов
Унарные операторы перегружаются таким же образом, как и бинарные. Главное отличие заключается, конечно, в том, что у них имеется лишь один операнд. В качестве примера ниже приведен метод, перегружающий оператор унарного минуса для класса ThreeD
.
// Перегрузить оператор унарного минуса,
public static ThreeD operator -(ThreeD op)
{
ThreeD result = new ThreeD();
result.x = -op.x;
result.у = -op.у;
result.z = -op.z;
return result;
}
В данном примере создается новый объект, в полях которого сохраняются отрицательные значения операнда перегружаемого унарного оператора, после чего этот объект возвращается операторным методом. Обратите внимание на то, что сам операнд не меняется. Это означает, что и в данном случае обычное назначение оператора унарного минуса сохраняется. Например, результатом выражения
а = -b
является отрицательное значение операнда b, но сам операнд b не меняется.
В C# перегрузка операторов ++ и -- осуществляется довольно просто. Для этого достаточно возвратить инкрементированное или декрементированное значение, но не изменять вызывающий объект. А все остальное возьмет на себя компилятор С#, различая префиксные и постфиксные формы этих операторов. В качестве примера ниже приведен операторный метод operator++()
для класса ThreeD
.
// Перегрузить унарный оператор ++.
public static ThreeD operator ++(ThreeD op)
{
ThreeD result = new ThreeD();
//возвратить результат инкрементирования
result.x = x + 1;
result.y = y + 1;
result.z = z + 1;
return result;
}
Ниже приведен расширенный вариант предыдущего примера программы, в котором демонстрируется перегрузка унарных операторов - и ++.
// Пример перегрузки бинарных и унарных операторов,
using System;
// Класс для хранения трехмерных координат,
class ThreeD {
int x, y, z; // трехмерные координаты
public ThreeD() { x = y = z = 0; }
public ThreeD(int i, int j, int k) {
x = i;
y = j;
z = k;
}
// Перегрузить бинарный оператор +.
public static ThreeD operator +(ThreeD op1, ThreeD op2) {
ThreeD result = new ThreeD();
/* Сложить координаты двух точек и возвратить результат. */
result.x = op1.x + op2.x;
result.y = op1.y + op2.y;
result.z = op1.z + op2.z;
return result;
}
// Перегрузить бинарный оператор -.
public static ThreeD operator -(ThreeD op1, ThreeD op2) {
ThreeD result = new ThreeD();
/* Обратить внимание на порядок следования операндов: op1 — левый операнд, ор2 — правый операнд. */
result.x = op1.x - op2.x;
result.y = op1.y - op2.y;
result.z = op1.z - op2.z;
return result;
}
// Перегрузить унарный оператор -.
public static ThreeD operator -(ThreeD op) {
ThreeD result = new ThreeD();
result.x = -op.x;
Читать дальше