- •Программирование на языке c#
- •3.1. Общие принципы 27
- •Введение
- •1 . Базовые элементы языка c#
- •1.1. Структура программы
- •Типы данных
- •1.3. Арифметические и логические операции
- •1.4. Условный оператор и оператор выбора
- •1.5. Ввод/вывод в консольном режиме
- •1.6. Комментарии
- •1.7. Массивы
- •1.8. Операторы цикла
- •1.9. Работа со ступенчатыми массивами
- •Контрольные вопросы
- •2. Работа с функциями
- •2.1. Общие принципы
- •2.2. Процедурное программирование в c#
- •Контрольные вопросы
- •3. Объектно-ориентированное программирование на c#
- •3.1. Общие принципы
- •3.2. Объявление и работа с классами
- •3.3. Перегрузка операторов
- •3.4. Индексаторы
- •3.5. Свойства
- •Использование класса в качестве типа данных
- •3.7. Работа со структурами
- •3.8. Наследование
- •3.9. Ссылки на объекты
- •3.10. Конструктор копирования
- •3.11. Виртуальные методы
- •3.12. Абстрактные методы и классы
- •3.13. Интерфейсы
- •3.14. Делегаты и события
- •3.15. Исключительные ситуации
- •Контрольные вопросы
- •4. Среда Microsoft Visual Studio 2005
- •4.1. Простейший пример
- •4.2. Средства управления работой программы
- •4.3. Создание меню
- •4.4. Ввод/вывод массивов
- •4.4.1. Ввод/вывод и обработка одномерного массива-строки
- •4.4.2. Ввод/вывод и обработка одномерного массива-столбца
- •4.4.3. Ввод/вывод и обработка двумерного массива
- •4.4.4. Форматированный ввод/вывод двумерного массива
- •4.5. Создание многооконных приложений
- •4.5.1. Создание sdi –приложения
- •4.5.2. Создание mdi –приложения
- •Контрольные вопросы
- •5. Объектно-ориентированное программирование в Microsoft Visual Studio 2005
- •5.1. Дополнение класса формы средствами решения прикладной задачи
- •5.2. Создание отдельных классов
- •5.3. Передача в классы указателей на формы
- •5.4. Создание форм в классах пользователя
- •Контрольные вопросы
- •Заключение
- •Библиографический список
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 константы и массива и многие другие не перегружены и их использование для одномерного массива будет ошибкой! Рекомендуем читателю расширить состав операций над одномерным массивом самостоятельно.