Slide 1

Slide 1 text

19 апреля 2022 [email protected] Анастасия Олеговна Хлобыстова Ассистент кафедры информатики Перегрузка операторов

Slide 2

Slide 2 text

2/30 2/30 Перегруженный оператор • позволяет применять встроенные операторы языка к разным типам, в том числе и пользовательским • функция со специальным именем: ключевое слово «оператор», за которым следует символ определяемого оператора. Как и любая другая функция, перегруженный оператор имеет тип возвращаемого значения и список параметров • всего лишь более удобный способ вызова функций → должно упрощать написание кода • перегрузка возможна только для пользовательских типов/классов Важно!

Slide 3

Slide 3 text

3/30 3/30 Общие правила при выборе перегружаемого оператора • Смысл перегруженного оператора должен быть очевиден для пользователя Например, использование операторов • + и += для конкатенации экземпляров std::basic_string<> • / и /= для конкатенации элементов пути std::filesystem::path • Приоритет и ассоциативность операторов при перегрузке не меняются std::сout<

Slide 4

Slide 4 text

4/30 4/30 Операторы, не рекомендуемые для перегрузки , && || Стандарт предусматривает • порядок вычисления операндов (слева направо) • для && и || еще и семантику быстрых вычислений & осторожно при использовании с шаблонами

Slide 5

Slide 5 text

5/30 5/30 А что на практике?

Slide 6

Slide 6 text

6/30 6/30 Operator<< 1/2

Slide 7

Slide 7 text

7/30 7/30 Operator<< 2/2

Slide 8

Slide 8 text

8/30 8/30 Оperator+=

Slide 9

Slide 9 text

9/30 9/30 Оperator+= и operator<<

Slide 10

Slide 10 text

10/30 10/30 Operator–= 1/2

Slide 11

Slide 11 text

11/30 11/30 Operator–= 2/2

Slide 12

Slide 12 text

12/30 12/30 Оperator==

Slide 13

Slide 13 text

13/30 13/30 Итог

Slide 14

Slide 14 text

14/30 14/30 Интерфейс и семантика перегруженных операторов • оператор присваивания должен возвращать ссылку на левый операнд, которая может быть использована как правый операнд в другом присваивании. a=b=c • операторы сравнения должны возвращать bool и не изменять операнды • унарные операторы +, –, ~ должны возвращать модифицированное значение и не изменять операнд

Slide 15

Slide 15 text

15/30 15/30 Реализация перегрузки операторов • как функция-член • как свободная функцию

Slide 16

Slide 16 text

16/30 16/30 Форма использования перегруженных операторов

Slide 17

Slide 17 text

17/30 17/30 Ещё особенности • Множественная перегрузка • Для унарных — с const и без него (для функций-членов) — параметр типа константная или обычная ссылка (для свободных функций) • Для бинарных операторов и оператора () количество перегрузок не ограничено. • Особенности перегрузки операторов с использованием свободных функций • Симметрия • Неявные преобразования • Расширение интерфейса класса

Slide 18

Slide 18 text

18/30 18/30 Определение дружественной свободной функции внутри класса Дружественные функции имеют доступ к приватным методам класса или структуры

Slide 19

Slide 19 text

19/30 19/30 Особенности перегрузки некоторых операторов Оператор –> Общая форма класса, в котором перегружен оператор –>

Slide 20

Slide 20 text

20/30 20/30 Оператор [] • к этому оператору запрещено применять «дружественные» функции Вариант 1. Оператор [] должен быть использован только в правой части оператора присваивания. То есть значение элемента массива в классе не изменяется. Вариант 2. Оператор [] должен размещаться в левой и правой части оператора присваивания. Можно изменять значения элементов массива по индексу.

Slide 21

Slide 21 text

21/30 21/30 Оператор [] 2/2 • можно реализовать только как функцию-член • может иметь любое число параметров любого типа, тип возвращаемого значения также произвольный • классы, с перегруженным оператором (), называются функциональными, их экземпляры называются функциональными объектами или функторами

Slide 22

Slide 22 text

22/30 22/30 Операторы сравнения < • антисимметричность (если x

Slide 23

Slide 23 text

23/30 23/30 Арифметические операторы

Slide 24

Slide 24 text

24/30 24/30 Инкремент, декремент 1/2 Для того, чтобы при реализации в классе, отличить префиксную и постфиксную формы реализации операторной функции ++ или --, нужно придерживаться следующих правил: • если перегружается префиксная форма оператора ++ / --, то в классе нужно реализовать операторную функцию operator++() / operator--() без параметров; • если перегружается постфиксная форма оператора ++ / --, то в классе нужно реализовать операторную функцию operator++(int d) / operator--(int d) с одним параметром. Параметр d необходим для указания того, что перегружается именно постфиксная реализация оператора

Slide 25

Slide 25 text

25/30 25/30 Инкремент, декремент 2/2

Slide 26

Slide 26 text

26/30 26/30 Операторы << и >>

Slide 27

Slide 27 text

27/30 27/30 Оператор присваивания 1/2

Slide 28

Slide 28 text

28/30 28/30 Оператор присваивания 2/2

Slide 29

Slide 29 text

29/30 29/30 Рекомендации к форме определения операторов Роб Мюррей, в своей книге «C++ Strategies and Tactics» определил следующие рекомендации по выбору формы оператора: Оператор Рекомендуемая форма Все унарные операторы Член класса = () [] -> ->* Обязательно член класса += -= /= *= ^= &= |= %= >>= <<= Член класса Остальные бинарные операторы Не член класса

Slide 30

Slide 30 text

19 апреля 2022 [email protected] Анастасия Олеговна Хлобыстова Ассистент кафедры информатики Перегрузка операторов