Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ C#.docx
Скачиваний:
16
Добавлен:
20.11.2019
Размер:
1.85 Mб
Скачать

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

Цель перегрузки операторов: определение новых правил выполнения существующих операций применительно к созданному пользователем классу. При этом приоритет операций не меняется. Перегрузить можно как бинарные, так и унарные операции, а также операции отношений. Для перегрузки операции необходимо в составе класса задать функцию с новыми правилами выполнения существующей операции; из наиболее известных операторов нельзя перегрузить оператор присваивания (=), а также составные операторы присваивания ( += и т.п.).

Общий формат перегрузки:

public static тип_возвращаемого_значения operator Знак_операции ( операнды )

{

// текст функции перегрузки

}

Пример. Напишем функцию перегрузки, которая будет выполнять операции над одномерным массивом: поэлементное сложение двух массивов, прибавление константы всем элементам массива, увеличение всех элементов массива на единицу, сравнение двух массивов (считаем, что один массив меньше другого, если все его элементы меньше элементов другого массива). В C#, если имеется перегрузка операции <, то должна быть и перегрузка противоположной операции >. Её отсутствие – синтаксическая ошибка. Для простоты – пусть оба массива имеют равное количество элементов.

namespace ConApp5

{

class array

{

int[] a;

int n;

public array(int k)

{

n = k;

a=new int [k];

}

public array(array z)

{

// вспомогательный конструктор, он может быть использован

// только после вызова основного

int m = z.a.Length;

a = new int[m];

}

public void inpt()

{

//ввод массива

for (int i = 0; i < a.Length; i++)

{

Console.Write("a[" + i + "]=");

a[i] = Convert.ToInt32(Console.ReadLine());

}

}

public void outp()

{

// вывод массива

for (int i = 0; i < a.Length; i++)

Console.WriteLine("a[" + i + "]=" + a[i]);

}

public static array operator +(array op1, array op2)

{

// перегрузка операции сложения элементов двух

// одинаковых массивов

array temp = new array(op1.n);

for (int i = 0; i < temp.n; i++)

{

temp.a[i] = op1.a[i] + op2.a[i];

}

return temp;

}

public static array operator +(array op1, int op2)

{

// перегрузка операции добавления константы элементам массива,

// константа на втором месте

array temp = new array(op1.n);

for (int i = 0; i < temp.n; i++)

{

temp.a[i] = op1.a[i] + op2;

}

return temp;

}

public static bool operator <(array op1, array op2)

{

// перегрузка операции сравнения двух массивов (операция >)

bool b1 = true;

for (int i = 0; i < op1.n; i++)

{

if (op1.a[i] > op2.a[i]) b1 = false;

}

return b1;

}

public static bool operator >(array op1, array op2)

{

// перегрузка операции сравнения двух массивов (операция <)

bool b1 = true;

for (int i = 0; i < op1.n; i++)

{

if (op1.a[i] < op2.a[i]) b1 = false;

}

return b1;

}

public static array operator -(array op1, array op2)

{

// перегрузка операции вычитания элементов двух

// одинаковых массивов

array temp = new array(op1.n);

for (int i = 0; i < temp.n; i++)

{

temp.a[i] = op1.a[i] - op2.a[i];

}

return temp;

}

public static array operator ++(array op)

{

// перегрузка операции инкремента

for (int i = 0; i < op.n; i++)

op.a[i]++;

return op;

}

}

class Program

{

static void Main(string[] args)

{

array a1, a2, a3;

bool q1, q2;

a1 = new array(4);

a1.inpt();

a2 = new array(4);

a2.inpt();

a3 = new array(4);

a3 = a1 + a2; //сложение двух массивов

a3.outp();

a1++; // инкремент

a1.outp();

a3 = a1 + 10; // сложение массива и константы

a3.outp();

q1 = a1 < a2; //сравнение

q2 = a1 > a2;

Console.WriteLine("BOOL " + q1 + " " + q2);

Console.ReadLine();

} } }

Обратите внимание, что операции декремента, сложениz константы и массива и многие другие не перегружены и их использование для одномерного массива будет ошибкой! Рекомендуем читателю расширить состав операций над одномерным массивом самостоятельно.