Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_ООП.docx
Скачиваний:
5
Добавлен:
18.09.2019
Размер:
114.62 Кб
Скачать
  1. Перегрузка бинарных и унарных операций.

Перегрузка унарных операций

Любая унарная операция @ может быть определена двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. В первом случае выражение @ Z означает вызов Z.operator @(), во втором - вызов operator @(Z).

Унарные операции, перегружаемые в рамках определенного класса, могут перегружаться только через нестатическую компонентную функцию без параметров. Вызываемый объект класса автоматически воспринимается как операнд.

Унарные операции, перегружаемые вне области класса (как глобальные функции), должны иметь один параметр типа класса. Передаваемый через этот параметр объект воспринимается как операнд.

Синтаксис:

а) в первом случае (описание в области класса):

тип_возвр_значения operator знак_операции

б) во втором случае (описание вне области класса):

тип_возвр_значения operator знак_операции (идентификатор_типа)

Перегрузка бинарных операций

Любая бинарная операция @ может быть определена двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае x @ y означает вызов x.operator @(y), во втором – вызов operator @(x, y).

Операции, перегружаемые внутри класса, могут перегружаться только нестатическими компонентными функциями с параметрами. Вызываемый объект класса автоматически воспринимается в качестве первого операнда.

Операции, перегружаемые вне области класса, должны иметь два операнда, один из которых должен иметь тип класса.

  1. Перегруженные операции индексирования, вызова функций, инкремента и декремента префиксных и постфиксных.

Унарные операции инкремента ++ и декремента -- существуют в двух формах: префиксной и постфиксной. В современной спецификации С++ определен способ, по которому компилятор может различить эти две формы. В соответствии с этим способом задаются две версии функции operator ++() и operator --(). Они определены следующим образом:

Префиксная форма:

operator ++();

operator --();

Постфиксная форма:

operator ++(int);

operator --(int);

Указание параметра int для постфиксной формы не специфицирует второй операнд, а используется только для отличия от префиксной формы.

Перегрузка операции вызова функции

Это операция '()'. Она является бинарной операцией. Первым операндом обычно является объект класса, вторым – список параметров.

  1. Перегрузка new, delete

Переменная объектного типа в динамической памяти создаётся в два этапа:

  1. Выделяется память с помощью оператора new.

  2. Вызывается конструктор класса.

Удаляется такая переменная тоже в два этапа:

  1. Вызывается деструктор класса.

  2. Освобождается память с помощью оператора delete.

Операторы new и delete можно перегрузить. Для этого есть несколько причин:

  • Можно увеличить производительность за счёт кеширования: при удалении объекта не освобождать память, а сохранять указатели на свободные блоки, используя их для вновь конструируемых объектов.

  • Можно выделять память сразу под несколько объектов.

  • Можно реализовать собственный "сборщик мусора" (garbage collector).

  • Можно вести лог выделения/освобождения памяти.

Операторы new и delete имеют следующие сигнатуры:

void *operator new(size_t size);

void operator delete(void *p);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]