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

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



Чтобы разобраться, как работает перегрузка операторов, начнем с примера, в котором перегружаются два бинарных оператора — "+" и "-". В следующей программе создается класс ThreeD поддержки координат объекта в трехмерном пространстве.

Перегруженный оператор "+" выполняет сложение отдельных координат двух ThreeD-объектов, а перегруженный оператор "-" вычитает координаты одного ThreeD -объекта из координат другого.

Текст программы

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();

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

k; }

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

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;

}

// Отображаем координаты 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.ReadLine();

}

}

}

}

При выполнении эта программа генерирует следующие результаты:

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

рассматриваемой операции. Это происходит и в случае стандартного арифметического оператора сложения "+", примененного, например, к числам 10 и 12. Результат операции 10+12 равен 22, но при его получении ни 10, ни 12 не были изменены. Хотя не существует правила, которое бы не позволяло перегруженному оператору изменять значение одного из его операндов, все же лучше, чтобы он не противоречил общепринятым нормам.

Обратите внимание на то, что метод operator* () возвращает объект типа ThreeD.

Несмотря на то что он мог бы возвращать значение любого допустимого в С# типа, тот факт, что он возвращает объект типа ThreeD, позволяет использовать оператор "+" в таких составных выражениях, как а+ь+с Здесь часть этого выражения, а+b, генерирует результат типа ThreeD, который затем суммируется с объектом с. И если бы выражение генерировало значение иного типа (а не типа ThreeD), такое составное выражение попросту не работало бы.

И еще один важный момент. При сложении координат внутри метода

operator+ () выполняется целочисленное сложение, поскольку отдельные координаты представляют собой целочисленные величины. Факт перегрузки оператора "+" для объектов типа ThreeD не влияет на оператор "+", применяемый к целым числам.

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

операнд является левым, а какой — правым.





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



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