Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Перегрузка операций.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
196.1 Кб
Скачать

Перегрузка унарных операторов

Унарные операторы перегружаются точно так же, как и унарные. Главное отличие, конечно же, состоит в том, что в этом случае существует только один операнд. Рассмотрим, например, метод, который перегружает унарный "минус" для класса ThreeD.

// Перегрузка унарного оператора "-".

public static ThreeD operator - (ThreeD op)

ThreeD result = new ThreeD();

result.x = -op.x;

result.у = -op.у;

result.z = -op.z;

return result;

Здесь создается новый объект, который содержит поля операнда, но со знаком "минус". Созданный таким образом объект и возвращается операторным методом operator-(). Обратите внимание на то, что сам операнд остается немодифицированным. Такое поведение соответствует обычному действию унарного "минуса". Например, в выражении а = -b а получает значение b, взятое с противоположным знаком, но само b при этом не меняется.

Однако в двух случаях операторный метод изменяет содержимое операнда. Речь идет об операторах инкремента (++) и декремента (--). Поскольку обычно ("в миру") эти операторы выполняют функции инкрементирования и декрементирования значений, соответственно, то перегруженные операторы "+" и " - " , как правило, инкрементируют свой операнд. Таким образом, при перегрузке этих операторов операнд обычно модифицируется. Например, рассмотрим метод operator++ () для класса ThreeD.

// Перегрузка унарного оператора "++".

public static ThreeD operator ++(ThreeD op)

// Оператор "++" модифицирует аргумент.

op.x++;

op.y++;

op.z++;

return op;

Обратите внимание: в результате выполнения этого операторного метода объект, на который ссылается операнд ор, модифицируется. Итак, операнд, подвергнутый операции "++", инкрементируется. Более того, модифицированный объект возвращается этим методом, благодаря чему оператор "++" можно использовать в более сложных выражениях.

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

// Перегрузка большего числа операторов.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace перегрузка_унарных_операторов

{

class ThreeD

{

Int X, y, z; // 3-х-мерные координаты.

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 opl, ThreeD op2)

{

ThreeD result = new ThreeD();

/* Суммирование координат двух точек

и возврат результата. */

result.x = opl.x + op2.x;

result.y = opl.y + op2.y;

result.z = opl.z + op2.z;

return result;

}

// Перегрузка бинарного оператора "-".

public static ThreeD operator -(ThreeD opl, ThreeD op2)

{

ThreeD result = new ThreeD();

/* Обратите внимание на порядок операндов.

- opl - левый операнд, ор2 - правый. */

result.x = opl.x - op2.x;

result.y = opl.y - op2.y;

result.z = opl.z - op2.z;

return result;

}

// Перегрузка унарного оператора "-".

public static ThreeD operator -(ThreeD op)

{

ThreeD result = new ThreeD();

result.x = -op.x;

result.y = -op.y;

result.z = -op.z;

return result;

}

// Перегрузка унарного оператора "++".

public static ThreeD operator ++(ThreeD op)

{

// Оператор "++" модифицирует аргумент.

op.x++;

op.y++;

op.z++;

return op;

}

// Отображаем координаты X, Y, Z.

public void show()

{

Console.WriteLine(x + ", " + y + ", " + z);

}

class ThreeDDemo

{

public static void Main()

{

ThreeD a = new ThreeD(1, 2, 3);

ThreeD b = new ThreeD(0, 10, 10);

ThreeD c = new ThreeD();

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

a.show();

Console.WriteLine() ;

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

b.show();

Console.WriteLine();

c = a + b; // Сложение а и b.

Console.Write("Результат сложения а + b: " ) ;

c.show();

Console.WriteLine() ;

c = a + b + c; // Сложение a, b и с.

Console.Write("Результат сложения а + b + с: " ) ;

c.show();

Console.WriteLine() ;

c = c - a; // Вычитание а из с.

Console.Write("Результат вычитания с - а: " ) ;

c.show();

Console.WriteLine();

c = c - b; // Вычитание b из с.

Console.Write("Результат вычитания с - Ь: " ) ;

c.show();

Console.WriteLine() ;

c = -a; // Присваивание -а объекту с.

Console.Write("Результат присваивания -а: " ) ;

c.show();

Console.WriteLine();

a++; // Инкрементирование а.

Console.Write("Результат инкрементирования а++: ") ;

a.show();

Console.ReadLine();

}

}

}

}

Результаты выполнения этой программы выглядят так:

Как вы уже знаете, операторы "++" и "--" имеют как префиксную, так и постфиксную форму. Однако при перегрузке оператора "++" обе формы вызывают один и тот же метод. Следовательно, в этом случае невозможно отличить префиксную форму оператора "++" от постфиксной. Это касается и перегрузки оператора "--".