Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
voprosy_NEW.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

69. Перегрузка операторов.

В языке С# допускается определять назначение оператора по отношению к создаваемому классу. Этот процесс называется перегрузкой операторов.

Когда оператор перегружается, ни одно из его первоначальных назначений не теряется. Он просто выполняет еще одну, новую операцию относительно конкретного объекта.

Главное преимущество перегрузки операторов - она позволяет плавно интегрировать класс нового типа в среду программирования.

Основы перегрузки операторов

Для перегрузки оператора служит ключевое слово operator, определяющее операторный метод, который, в свою очередь, определяет действие оператора относительно своего класса.

// Общая форма перегрузки унарного оператора.

public static возвращаемый_тип operator op(тип_параметра операнд)

{ // операции }

// Общая форма перегрузки бинарного оператора.

public static возвращаемый_тип operator ор(тип_параметра1 операнд1,

тип_параметра1 операнд2) { // операции }

Операторные методы должны иметь оба типа, public и static.

Тип операнда унарных операторов должен быть таким же, как и у класса, для которого перегружается оператор. А в бинарных операторах хотя бы один из операндов должен быть такого же типа, как и у его класса. Например, назначение оператора + нельзя переопределить для элементов типа int или string.

Унарные операторы перегружаются таким же образом, как и бинарные. Главное отличие заключается, конечно, в том, что у них имеется лишь один операнд.

//пример перегрузки для сложения многочленов

class Polynomial {

double[] Matrix; int N;

public Polynomial(double[] matrix, int n) { Matrix = matrix; N = n; }

public static Polynomial operator +(Polynomial A, Polynomial B) {

int D1 = A.N; double[] M1 = new double[D1 + 1];

Polynomial C = new Polynomial(M1, D1);

for (int i = 0; i < A.N + 1; i++) { C.Matrix[i] = A.Matrix[i] + B.Matrix[i]; }

return C; }

}

class Program {

static void Main(string[] args) {

Console.Write("Степень многочлена :");

…//считывание N, матриц Matrix и Matrix1

Polynomial A = new Polynomial(Matrix,N);

Polynomial B = new Polynomial(Matrix1,N);

Console.WriteLine("A+B :");

Polynomial C=A+B;

C.Vivod(C);

Console.ReadKey(); } }

Перегрузка операторов отношения

Операторы отношения, например == и <, могут также перегружаться. Как правило, перегруженный оператор отношения возвращает логическое значение true и false. Использование их в условных выражениях. Если же возвращается результат другого типа, то тем самым сильно ограничивается применимость операторов отношения.

Операторы должны перегружаться попарно( == и ! =, < и >, <= и >= ).

Перегрузка операторов true и false

После перегрузки этих ключевых слов в качестве унарных операторов для конкретного класса появляется возможность использовать объекты этого класса для управления операторами if, while, for и do-while или же в условном выражении ?.

Операторы true и false должны перегружаться попарно, а не раздельно. Ниже приведена общая форма перегрузки этих унарных операторов.

public static bool operator true(тип_параметра операнд)

{ //Возврат логического значения true или false. }

public static bool operator false(тип_параметра операнд)

{ // Возврат логического значения true или false.}

Перегрузка логических операторов

В С# предусмотрены следующие логические операторы: &, |, !, & & и | |. Из них перегрузке подлежат только операторы &, [ и !.

Операторы преобразования

Оператор преобразования преобразует объект исходного класса в другой тип.

Существуют две формы операторов преобразования: явная и неявная.

public static explicit operator целевой_тип(исходный_тип v) {return значение;}

public static implicit operator целевой_тип(исходный_тип v) {return значение;}

Если оператор преобразования указан в неявной форме (implicit), то преобразование вызывается автоматически. Если же оператор преобразования указан в явной форме (explicit), то преобразование вызывается в том случае, когда выполняется приведение типов.

На операторы преобразования накладывается ряд следующих ограничений.

• Исходный или целевой тип преобразования должен относиться к классу, для которого объявлено данное преобразование. Нельзя переопределить преобразование в тип int, если оно первоначально указано как преобразование в тип double.

• Нельзя указывать преобразование в класс object или же из этого класса.

• Для одних и тех же исходных и целевых типов данных нельзя указывать одновременно явное и неявное преобразование.

• Нельзя указывать преобразование базового класса в производный класс.

• Нельзя указывать преобразование в интерфейс или же из него.

Несмотря на все преимущества неявных преобразований, к ним следует прибегать только в тех случаях, когда преобразованию не свойственны ошибки. Неявные преобразования должны быть организованы только в том случае, если удовлетворяются следующие условия. Во-первых, информация не теряется, например, в результате усечения, переполнения или потери знака. И во- вторых, преобразование не приводит к исключительной ситуации. Если же неявное преобразование не удовлетворяет этим двум условиям, то следует выбрать явное преобразование.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]