net framework і c# module 7_old

19
.NET Framework і C# Модуль 7 . Перевантаження операторів

Upload: andriy-gladkiy

Post on 21-Jan-2018

138 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Net framework і c# module 7_old

.NET Framework і C#Модуль 7. Перевантаження

операторів

Page 2: Net framework і c# module 7_old

В цьому модулі: Введення в перевантаження операторів;

Перевантаження унарних операторів;

Перевантаження бінарних операторів;

Перевантаження операторів відношення;

Перевантаження логічних операторів;

Перевантаження операторів true і false;

Перевантаження операторів перетворення;

2Andrey Gladky [email protected]

Page 3: Net framework і c# module 7_old

Введення в перевантаження операторів Перевантаження операторів дозволяє вказати як, стандартні

оператори будуть використовуватись з об’єктами класу.

Перевантаження операторів використовується для покращення

читання програм.

Вимоги до перевантаження операторів:

• перевантаження операторів повинно виконуватись відкритими

статичними методами класу.

• у метода - оператора тип повертаючого значення або одного із

параметрів повинен співпадати з типом, в якому виконується

перевантаження операторів.

• параметри метода - оператора не повинні містити модифікатор out і

ref.

Andrey Gladky [email protected] 3

Page 4: Net framework і c# module 7_old

Andrey Gladky [email protected] 4

Також як і з C++ в C# перевантаження операторів має деякі

обмеження:

• перевантаження не може змінити приорітет операторів

• при перевантажені не можна змінити число операндів, з

якими працює оператор

• не всі оператори можуть перевантажуватись

Page 5: Net framework і c# module 7_old

Оператори що допускають перевантаження

Andrey Gladky [email protected] 5

Оператор Опис

- Зміна знака змінної

! Операція логічного заперечення

~ Операція побітового доповнення, яка призводить до

інверсії кожного біта

++, -- Інкримент і декримент

true, false Критерій істинності об’єкта, визначається

розробником класу

+, -, *, /, % Арифметичні оператори

&, |, ^, <<, >> Бітові операції

==, !=, <, >, <=, >= Оператори порівняння

&&, || Логічні оператори

[] Операції доступу до елементів масиву,

моделюються за рахунок індексаторів

() Операції перетворення

Page 6: Net framework і c# module 7_old

Оператори що не допускають перевантаження

Andrey Gladky [email protected] 6

Оператор Опис

+=, -=, *=, /=,%=, &=,

|=, ^=, <<=, >>=

Перевантажуються автоматично при

перевантаженні відповідних бінарних операторів

= Присвоєння

. Доступ до члену типу

?: Оператора умови

new Створення об’єкта

as, is,typeof Використовується для отримання інформації про

тип

->, sizeof, *, & Доступні лише в небезпечному коді

Синтаксис перевантаження:

public static <тип результату> operator <символ операції>

(параметри)

Page 7: Net framework і c# module 7_old

Перевантаження унарних операторів

Унарні оператори отримують лише один операнд

Повинен мати тип класу, в якому виконується перевантаження

Andrey Gladky [email protected] 7

public static class_name operator ++ (class_name cn)

{

//...

}

Page 8: Net framework і c# module 7_old

Andrey Gladky [email protected] 8

Демонстрація

Page 9: Net framework і c# module 7_old

Перевантаження бінарних операторів

Andrey Gladky [email protected] 9

public static class_name operator + (class_name cn, args)

{

//...

}

Page 10: Net framework і c# module 7_old

Andrey Gladky [email protected] 10

Демонстрація

Page 11: Net framework і c# module 7_old

Перевантаження операторів відношення Операції порівняння перевантажуються парами

== і !=

< i >

<= i >=

При перевантаженні операторів відношення потрібно враховувати, що

є два способи перевірки на рівність

Рівність посилань

Рівність значень

В класі object визначені наступні методи порівняння об’єктів

Andrey Gladky [email protected] 11

public static bool ReferenceEquals(Object obj1, Object obj2)

Public bool virtual Equals(Object obj)

Page 12: Net framework і c# module 7_old

Andrey Gladky [email protected] 12

Демонстрація

Page 13: Net framework і c# module 7_old

Перевантаження операторів true,

false

Andrey Gladky [email protected] 13

Під час перевантаження операторів true і false розробник задає

критерій істинності для свого типу даних.

Перевантаження виконується за наступними правилами:

◦ Оператор true повинен повертати true, якщо стан об’єкта істинний і false якщо інакше

◦ Оператор false повинен повертати true, якщо стан об’єкта хибний і false якщо інакше

◦ Оператори true і false потрібно перевантажувати в парі

При цьому можлива ситуація, коли стан не являється ні істинним ні

хибним – обидва оператори можуть повернути false.

Таблиця істинності

Значення Оператор True Оператор False

1 true false

-1 false true

0 false false

Page 14: Net framework і c# module 7_old

Andrey Gladky [email protected] 14

Демонстрація

Page 15: Net framework і c# module 7_old

Перевантаження логічних операторів Умовні логічні оператори && і || не можна перевантажити, але вони

обчислюються за допомогою & і |, що допускають перевантаження.

Таблиця істинності

Andrey Gladky [email protected] 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

Page 16: Net framework і c# module 7_old

Andrey Gladky [email protected] 16

Демонстрація

Page 17: Net framework і c# module 7_old

Перевантаження операторів перетворення Приведення може бути двох типів

◦ Із довільного типу в власний тип

◦ Із власного типу в довільний

Приведення типів може виконуватись явним і не явним способом:

◦ implicit – задає не явне перетворення, можна використовувати, якщо перетворення

завжди безпечне

◦ explicit – задає явне перетворення, варто використовувати, якщо можлива втрата даних

Andrey Gladky [email protected] 17

public static {implicit / explicit} operator цільовий тип (вихідний тип)

{

//….

}

Page 18: Net framework і c# module 7_old

Andrey Gladky [email protected] 18

Демонстрація

Page 19: Net framework і c# module 7_old

Створити клас який буде містити два масиви

(множини). Перевантажити оператори +, *, -,

таким чином щоб можна було б виконати

наступні операції над множинами:

• перетин множин – тобто повернути множину С усіх

елементів, що належать як множині А, так і множині

B (*)

• об’єднання множин – тобто повернути множину С,

що складається з усіх елементів, які належать хоча б

одній із цих множин (+)

• різниці множин – тобто повернути множина С, яка

складається з усіх елементів, які належать множні А

і не належать множині В.(-)

Andrey Gladky [email protected] 19