Слайд 2Перегрузка операций
Перегрузка операций является исключительно синтаксическим удобством.
Допустим, с объектами какого-то
класса нам нужно выполнить операции:
C = (A + B) * D;
Без перегрузки это будет выглядеть как-то так:
С = D.Multiply(A.Add(B));
Слайд 3Перегрузить можно такие операции как :
унарные +, -, !, ~,
++, --, true, false
бинарные +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=
Слайд 4Перегрузка операций
При перегрузке бинарной операции автоматически перегружается соответствующая операция с присваиванием
(например, при перегрузке операции + перегрузится и операция +=).
Слайд 5Перегрузка операций
Некоторые операции могут быть перегружены только парами: == и !=,
> и <, >= и <=, true и false.
Слайд 6Для каких классов есть смысл определять такие операции?
Понятно, что нет
смысла складывать CPet (питомцев) или CStudent (студентов) – но их можно сравнивать!
Слайд 7Для каких классов есть смысл определять такие операции?
практически любой объект
из мира математики (векторы, матрицы, функции, комплексные числа, рациональные числа и т.д.)
графические объекты и их координаты
денежные суммы в финансовых программах
текстовые данные
вообще любые структуры
Слайд 8Перегрузка операций
Для перегрузки операций используется специальный статический метод, имя которого образовано
из ключевого слова operator и знака операции. Количество формальных параметров метода зависит от типа операции: унарная операция требует одного параметра, бинарная – двух. Метод обязательно должен иметь модификатор доступа public.
Слайд 11Перегрузка операций
Параметры метода перегрузки - по значению.
Тип формальных параметров и
тип возвращаемого значения метода перегрузки обычно совпадает с описываемым типом, хотя это и не обязательное условие.
Более того, класс или структура могут содержать версии одной операции с разным типом формальных параметров.
Однако не допускается существование двух версий метода перегрузки операции, различающихся только типом возвращаемого значения.
Также класс не может содержать перегруженной операции, у которой ни один из формальных параметров не имеет типа класса.
Слайд 12Внесем некоторые изменения в класс Complex:
Слайд 13Перегрузка операций
Любой класс может перегрузить операции true и false. Операции перегружаются
парой, тип возвращаемого значения операций – булевский. Если в классе выполнена подобная перегрузка, объекты класса могут использоваться как условия в операторах условного перехода или циклов (т.е. объект может быть истинным или ложным). При вычислении условий используется перегруженная версия операции true.
Слайд 16Класс комплексных чисел
Если оба < 0 будет ложь.
Слайд 17Перегрузка операций
Кроме перечисленных операций, любой класс может перегрузить операции для неявного
и явного приведения типов. При этом используется следующий синтаксис:
public static implicit operator <целевой тип>(<привод.тип> <имя>)
public static explicit operator <целевой тип>(<привод.тип> <имя>)
Слайд 18Перегрузка операций
Ключевое слово implicit используется при перегрузке неявного приведения типов, а
ключевое слово explicit – при перегрузке операции явного приведения. Либо <целевой тип>, либо <приводимый тип> должены совпадать с типом того класса, где выполняется перегрузка операций.