Добавить в цитаты Настройки чтения

Страница 118 из 502

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

<b>// Перегрузить оператор унарного минуса, </b>

<b>public static ThreeD operator -(ThreeD op)</b>

<b>{</b>

<b>  ThreeD result = new ThreeD();</b>

<b>  result.x = -op.x;</b>

<b>  result.у = -op.у;</b>

<b>  result.z = -op.z;</b>

<b>  return result;</b>

<b>}</b>

В данном примере создается новый объект, в полях которого сохраняются отрицательные значения операнда перегружаемого унарного оператора, после чего этот объект возвращается операторным методом. Обратите внимание на то, что сам операнд не меняется. Это означает, что и в данном случае обычное назначение оператора унарного минуса сохраняется. Например, результатом выражения

<b>а = -b</b>

является отрицательное значение операнда b, но сам операнд b не меняется.

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

<b>// Перегрузить унарный оператор ++. </b>

<b>public static ThreeD operator ++(ThreeD op)</b>

<b>{</b>

<b>  ThreeD result = new ThreeD();</b>

<b>  //возвратить результат инкрементирования</b>

<b>  result.x = x + 1;</b>

<div class="fb2-code"><code>&lt;b&gt;  result.y = y + 1;&lt;/b&gt;</code></div>

<div class="fb2-code"><code>&lt;div class=&quot;fb2-code&quot;&gt;&lt;code&gt;&amp;lt;b&amp;gt;  result.z = z + 1;&amp;lt;/b&amp;gt;&lt;/code&gt;&lt;/div&gt;</code></div>

<div class="fb2-code"><code>&lt;div class=&quot;fb2-code&quot;&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;fb2-code&amp;quot;&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;b&amp;amp;gt;  return result;&amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/div&gt;</code></div>

<b>}</b>

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

<b>// Пример перегрузки бинарных и унарных операторов, </b>

<b>using System;</b>

<b>// Класс для хранения трехмерных координат, </b>

<b>class ThreeD {</b>

<b>  int x, y, z; // трехмерные координаты</b>

<b>  public ThreeD() { x = y = z = 0; }</b>

<b>  public ThreeD(int i, int j, int k) {</b>

<b>    x = i;</b>

<b>    y = j;</b>

<b>    z = k;</b>

<b>  }</b>

<b>  // Перегрузить бинарный оператор +.</b>

<b>  public static ThreeD operator +(ThreeD op1, ThreeD op2) {</b>

<b>    ThreeD result = new ThreeD();</b>

<b>    /* Сложить координаты двух точек и возвратить результат. */</b>

<b>    result.x = op1.x + op2.x;</b>

<b>    result.y = op1.y + op2.y;</b>

<b>    result.z = op1.z + op2.z;</b>

<b>    return result;</b>

<b>  }</b>

<b>  // Перегрузить бинарный оператор -.</b>

<b>  public static ThreeD operator -(ThreeD op1, ThreeD op2) {</b>

<b>    ThreeD result = new ThreeD();</b>

<b>    /* Обратить внимание на порядок следования операндов: op1 — левый операнд, ор2 — правый операнд. */</b>

<b>    result.x = op1.x - op2.x;</b>

<b>    result.y = op1.y - op2.y;</b>

<b>    result.z = op1.z - op2.z;</b>

<b>    return result;</b>

<b>  }</b>

<b>  // Перегрузить унарный оператор -. </b>

<b>  public static ThreeD operator -(ThreeD op) {</b>

<b>    ThreeD result = new ThreeD();</b>

<b>    result.x = -op.x;</b>

<b>    result.y = -op.y;</b>

<b>    result.z = -op.z;</b>

<b>    return result;</b>

<b>  }</b>

<b>  // Перегрузить унарный оператор ++. </b>

<b>  public static ThreeD operator ++(ThreeD op) {</b>