View
138
Download
0
Category
Preview:
Citation preview
.NET Framework і C#Модуль 7. Перевантаження
операторів
В цьому модулі: Введення в перевантаження операторів;
Перевантаження унарних операторів;
Перевантаження бінарних операторів;
Перевантаження операторів відношення;
Перевантаження логічних операторів;
Перевантаження операторів true і false;
Перевантаження операторів перетворення;
2Andrey Gladky KspDevelop@gmail.com
Введення в перевантаження операторів Перевантаження операторів дозволяє вказати як, стандартні
оператори будуть використовуватись з об’єктами класу.
Перевантаження операторів використовується для покращення
читання програм.
Вимоги до перевантаження операторів:
• перевантаження операторів повинно виконуватись відкритими
статичними методами класу.
• у метода - оператора тип повертаючого значення або одного із
параметрів повинен співпадати з типом, в якому виконується
перевантаження операторів.
• параметри метода - оператора не повинні містити модифікатор out і
ref.
Andrey Gladky KspDevelop@gmail.com 3
Andrey Gladky KspDevelop@gmail.com 4
Також як і з C++ в C# перевантаження операторів має деякі
обмеження:
• перевантаження не може змінити приорітет операторів
• при перевантажені не можна змінити число операндів, з
якими працює оператор
• не всі оператори можуть перевантажуватись
Оператори що допускають перевантаження
Andrey Gladky KspDevelop@gmail.com 5
Оператор Опис
- Зміна знака змінної
! Операція логічного заперечення
~ Операція побітового доповнення, яка призводить до
інверсії кожного біта
++, -- Інкримент і декримент
true, false Критерій істинності об’єкта, визначається
розробником класу
+, -, *, /, % Арифметичні оператори
&, |, ^, <<, >> Бітові операції
==, !=, <, >, <=, >= Оператори порівняння
&&, || Логічні оператори
[] Операції доступу до елементів масиву,
моделюються за рахунок індексаторів
() Операції перетворення
Оператори що не допускають перевантаження
Andrey Gladky KspDevelop@gmail.com 6
Оператор Опис
+=, -=, *=, /=,%=, &=,
|=, ^=, <<=, >>=
Перевантажуються автоматично при
перевантаженні відповідних бінарних операторів
= Присвоєння
. Доступ до члену типу
?: Оператора умови
new Створення об’єкта
as, is,typeof Використовується для отримання інформації про
тип
->, sizeof, *, & Доступні лише в небезпечному коді
Синтаксис перевантаження:
public static <тип результату> operator <символ операції>
(параметри)
Перевантаження унарних операторів
Унарні оператори отримують лише один операнд
Повинен мати тип класу, в якому виконується перевантаження
Andrey Gladky KspDevelop@gmail.com 7
public static class_name operator ++ (class_name cn)
{
//...
}
Andrey Gladky KspDevelop@gmail.com 8
Демонстрація
Перевантаження бінарних операторів
Andrey Gladky KspDevelop@gmail.com 9
public static class_name operator + (class_name cn, args)
{
//...
}
Andrey Gladky KspDevelop@gmail.com 10
Демонстрація
Перевантаження операторів відношення Операції порівняння перевантажуються парами
== і !=
< i >
<= i >=
При перевантаженні операторів відношення потрібно враховувати, що
є два способи перевірки на рівність
Рівність посилань
Рівність значень
В класі object визначені наступні методи порівняння об’єктів
Andrey Gladky KspDevelop@gmail.com 11
public static bool ReferenceEquals(Object obj1, Object obj2)
Public bool virtual Equals(Object obj)
Andrey Gladky KspDevelop@gmail.com 12
Демонстрація
Перевантаження операторів true,
false
Andrey Gladky KspDevelop@gmail.com 13
Під час перевантаження операторів true і false розробник задає
критерій істинності для свого типу даних.
Перевантаження виконується за наступними правилами:
◦ Оператор true повинен повертати true, якщо стан об’єкта істинний і false якщо інакше
◦ Оператор false повинен повертати true, якщо стан об’єкта хибний і false якщо інакше
◦ Оператори true і false потрібно перевантажувати в парі
При цьому можлива ситуація, коли стан не являється ні істинним ні
хибним – обидва оператори можуть повернути false.
Таблиця істинності
Значення Оператор True Оператор False
1 true false
-1 false true
0 false false
Andrey Gladky KspDevelop@gmail.com 14
Демонстрація
Перевантаження логічних операторів Умовні логічні оператори && і || не можна перевантажити, але вони
обчислюються за допомогою & і |, що допускають перевантаження.
Таблиця істинності
Andrey Gladky KspDevelop@gmail.com 15
Операнд1 Операнд2 & |
True True True True
False True False True
Null True Null True
True False False True
False False False False
Null False False Null
True Null Null True
False Null False Null
Null Null Null Null
Andrey Gladky KspDevelop@gmail.com 16
Демонстрація
Перевантаження операторів перетворення Приведення може бути двох типів
◦ Із довільного типу в власний тип
◦ Із власного типу в довільний
Приведення типів може виконуватись явним і не явним способом:
◦ implicit – задає не явне перетворення, можна використовувати, якщо перетворення
завжди безпечне
◦ explicit – задає явне перетворення, варто використовувати, якщо можлива втрата даних
Andrey Gladky KspDevelop@gmail.com 17
public static {implicit / explicit} operator цільовий тип (вихідний тип)
{
//….
}
Andrey Gladky KspDevelop@gmail.com 18
Демонстрація
Створити клас який буде містити два масиви
(множини). Перевантажити оператори +, *, -,
таким чином щоб можна було б виконати
наступні операції над множинами:
• перетин множин – тобто повернути множину С усіх
елементів, що належать як множині А, так і множині
B (*)
• об’єднання множин – тобто повернути множину С,
що складається з усіх елементів, які належать хоча б
одній із цих множин (+)
• різниці множин – тобто повернути множина С, яка
складається з усіх елементів, які належать множні А
і не належать множині В.(-)
Andrey Gladky KspDevelop@gmail.com 19
Recommended