Страница 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><b> result.y = y + 1;</b></code></div>
<div class="fb2-code"><code><div class="fb2-code"><code>&lt;b&gt; result.z = z + 1;&lt;/b&gt;</code></div></code></div>
<div class="fb2-code"><code><div class="fb2-code"><code>&lt;div class=&quot;fb2-code&quot;&gt;&lt;code&gt;&amp;lt;b&amp;gt; return result;&amp;lt;/b&amp;gt;&lt;/code&gt;&lt;/div&gt;</code></div></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>