Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



Унарные операторы перегружаются точно так же, как и унарные. Главное отличие, конечно же, состоит в том, что в этом случае существует только один операнд. Рассмотрим, например, метод, который перегружает унарный "минус" для класса 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();

}

}

}

}

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

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





Дата публикования: 2015-06-12; Прочитано: 441 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...