Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Унарные операторы перегружаются точно так же, как и унарные. Главное отличие, конечно же, состоит в том, что в этом случае существует только один операнд. Рассмотрим, например, метод, который перегружает унарный "минус" для класса 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!