Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Перегрузка унарных операторов C# Полное руководство Герберт Шилдт

Перегрузка унарных операторов C# Полное руководство Герберт Шилдт

Унарные операторы перегружаются таким же образом, как и бинарные. Главное отличие заключается, конечно, в том, что у них имеется лишь один операнд. В качестве примера ниже приведен метод, перегружающий оператор унарного минуса для класса ThreeD.

// Перегрузить оператор унарного минуса.
public static ThreeD operator - (ThreeD op)
{
   ThreeD result = new ThreeD ();
   
   result.x = -op.x;
   result.у = -op.y;
   result.z = -op.z;

   return result;
}

В данном примере создается новый объект, в полях которого сохраняются отрицательные значения операнда перегружаемого унарного оператора, после чего этот объект возвращается операторным методом. Обратите внимание на то, что сам операнд не меняется. Это означает, что и в данном случае обычное назначение оператора унарного минуса сохраняется. Например, результатом выражения
   а = -b
является отрицательное значение операнда b, но сам операнд b не меняется.
В языке C# перегрузка операторов ++ и — осуществляется довольно просто. Для этого достаточно возвратить инкрементированное или декрементированное значение, но не изменять вызывающий объект. А все остальное возьмет на себя компилятор С#, различая префиксные и постфиксные формы этих операторов. В качестве примера ниже приведен операторный метод operator++ () для класса ThreeD.

// Перегрузить унарный оператор ++.
public static ThreeD operator ++(ThreeD op)
{
   ThreeD result = new ThreeD ();

   // Возвратить результат инкрементирования.
   result.x = op.x + 1;
   result.у = op.y + 1;
   result.z = op.z + 1;

   return result;
}


Ниже приведен расширенный вариант предыдущего примера программы, в котором демонстрируется перегрузка унарных операторов - и ++.

// Пример перегрузки бинарных и унарных операторов.

using System;

// Класс для хранения трехмерных координат.
class ThreeD {
int x, у, z; // трехмерные координаты

public ThreeD () { x = у = z = 0; }
public ThreeD (int i, int j, int k) { x = i; у = j; z = k; }

// Перегрузить бинарный оператор +.
public static ThreeD operator +(ThreeD op1, ThreeD op2)
{
   ThreeD result = new ThreeD ();

   /* Сложить координаты двух точек и возвратить
       результат. */
   result.х = op1.x + ор2.х;
   result.у = op1.y + ор2.у;
   result.z = op1.z + op2.z;
   return result;
}

// Перегрузить бинарный оператор -.
public static ThreeD operator -(ThreeD op1, ThreeD op2)
{
   ThreeD result = new ThreeD ();

   /* Обратить внимание на порядок следования
       операндов: op1 - левый операнд, ор2 - правый
       операнд. */
   result.х = op1.x - ор2.х;
   result.у = op1.y - ор2.у;
   result.z = op1.z - op2.z;

   return result;
}

// Перегрузить унарный оператор -.
public static ThreeD operator - (ThreeD op)
{
   ThreeD result = new ThreeD();

   result.x = -op.x;
   result.у = -op.у;
   result.z = -op.z;

   return result;
}

// Перегрузить унарный оператор ++.
public static ThreeD operator ++(ThreeD op)
{
   ThreeD result = new ThreeD ();

   // Возвратить результат инкрементирования.
   result.x = op.x + 1;
   result.у = op.y + 1;
   result.z = op.z + 1;

   return result;
}
// Вывести координаты X, Y, Z.
public void Show()
   {
      Console.WriteLine (x + ", " + у + ", " + z) ;
   }
}

class ThreeDDemo {
   static void Main() {
      ThreeD a = new ThreeD(1, 2, 3);
      ThreeD b = new ThreeD (10, 10, 10);
      ThreeD с = new ThreeD ();

      Console.Write("Координаты точки a: ");
      a.Show () ;
      Console.WriteLine();

      Console.Write("Координаты точки b: ");
      b.Show () ;
      Console.WriteLine();

с = a + b; // сложить координаты точек а и b
      Console.Write("Результат сложения a + b: ");
      c.Show () ;
      Console.WriteLine();

      c = a + b + c; // сложить координаты точек a, b и с
      Console.Write("Результат сложения a + b + с: ");
      с.Show();
      Console.WriteLine();

      с = с - a; // вычесть координаты точки а
      Console.Write("Результат вычитания с - а: ");
      с. Show () ;
      Console.WriteLine();

      с = с - b; // вычесть координаты точки b
      Console.Write("Результат вычитания с - b: ");
      с. Show () ;
      Console.WriteLine();

      с = -а; // присвоить точке с отрицательные
                  // координаты точки а
      Console.Write("Результат присваивания -а: ");
      с. Show () ;
      Console.WriteLine();

      с = а++; // присвоить точке с координаты точки а,
                      //а затем инкрементировать их
      Console.WriteLine("Если с = а++");
      Console.Write("то координаты точки с равны ");
      с.Show();
      Console.Write("а координаты точки а равны ");
      a. Show () ;

      // Установить исходные координаты (1,2,3) точки а
      а = new ThreeD(1, 2, 3);
      Console.Write("\n Установка исходных координат точки а: ");
      а.Show ();

      с = ++а; // инкрементировать координаты точки а,
                      //а затем присвоить их точке с
      Console.WriteLine ("\n Если с = ++а");
      Console.Write("то координаты точки с равны ");
      с.Show ();
      Console.Write("а координаты точки а равны ");
      a.Show () ;
   }
}


Вот к какому результату приводит выполнение данной программы:
   Координаты точки а: 1, 2, 3
   Координаты точки b: 10, 10, 10
   Результат сложения а + b: 11, 12, 13
   Результат сложения а + b + с: 22, 24, 26
   Результат вычитания с - а: 21, 22, 23
   Результат вычитания с - b: 11, 12, 13
   Результат присваивания -а: -1, -2, -3
 
   Если с = а++
   то координаты точки с равны 1, 2, 3
   а координаты точки а равны 2, 3, 4
   
   Установка исходных координат точки а: 1, 2, 3
   
   Если с = ++а
   то координаты точки с равны 2, 3, 4
   а координаты точки а равны 2, 3, 4