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

Программирование – 2 курс осень 2020 – 11 занятие

ТиМПИ
November 17, 2020
120

Программирование – 2 курс осень 2020 – 11 занятие

ТиМПИ

November 17, 2020
Tweet

More Decks by ТиМПИ

Transcript

  1. dscs.pro spbu.ru 2/20 Перегруженный оператор Перегрузка операторов (operator overloading) —

    это возможность применять встроенные операторы языка к разным типам, в том числе и пользовательским. В C++ можно перегружать следующие операторы: +, -, *, /, %, ^, &, |, ~, !, ,, =, <, >, <=, >=, ++, –-, <<, >>, ==, !=, &&, ||, +=, -=, /=, %=, ^=, &=, |=, *=, <<=, >>=, [], (), ->, ->*, new, new[], delete, delete[]
  2. dscs.pro spbu.ru 3/20 Перегруженный оператор Смысл перегруженного оператора должен быть

    очевиден для пользователя Например, использование операторов + и += для конкатенации экземпляров std::basic_string<> / и /= для конкатенации элементов пути Приоритет и ассоциативность операторов при перегрузке не меняются std::сout<<c?x:y; это (std::сout<<c)?x:y; а не std::сout<<(c?x:y);
  3. dscs.pro spbu.ru 4/20 Операторы, не рекомендуемые для перегрузки , &&

    || Стандарт предусматривает порядок вычисления операндов (слева направо) для && и || еще и семантику быстрых вычислений & осторожно при использовании с шаблонами
  4. dscs.pro spbu.ru 5/20 Интерфейс и семантика перегруженных операторов оператор присваивания

    должен возвращать ссылку на левый операнд, которая может быть использована как правый операнд в другом присваивании. a=b=c операторы сравнения должны возвращать bool и не изменять операнды унарные операторы +, -, ~ должны возвращать модифицированное значение и не изменять операнд
  5. dscs.pro spbu.ru 13/20 Оператор () можно реализовать только как функцию-член

    может иметь любое число параметров любого типа, тип возвращаемого значения также произвольный классы, с перегруженным оператором (), называются функциональными, их экземпляры называются функциональными объектами или функторами
  6. dscs.pro spbu.ru 14/20 Операторы сравнения < • антисимметричность (если x<y

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