Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Программирование – 1 курс весна 2022 – 9 занятие

Программирование – 1 курс весна 2022 – 9 занятие

ТиМПИ

April 19, 2022
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. 8/30
    8/30
    Оperator+=

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. 12/30
    12/30
    Оperator==

    View full-size slide

  13. 13/30
    13/30
    Итог

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  22. 22/30
    22/30
    Операторы сравнения
    <
    • антисимметричность (если xравно true, то y• транзитивность (если xy• иррефлексивность (xравно false)
    • транзитивная эквивалентность
    (если !(x&& !(z==
    • Симметричность (если x==y, то y==x)
    • Транзитивность (если x==y и y==z, то x==z)
    • Рефлексивность (x==x всегда равно true)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide