Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
92
Добавлен:
10.12.2013
Размер:
427.01 Кб
Скачать

3.7. Перегрузка операции delete.

Операция-функция delete бывает двух видов:

void operator delete(void*);

void operator delete(void*,size_t);

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

Особенностью перегрузки операции delete является то, что глобальные операции delete не могут быть перегружены. Их можно перегрузить только по отношению к классу.

В заключении сформулируем основные правила перегрузки операций.

3.8. Основные правила перегрузки операций.

1) Вводить собственные обозначения для операций, не совпадающие со стандартными операциями языка С++ , нельзя.

2) Не все операции языка С++ могут быть перегружены. Нельзя перегрузить следующие операции:

.’ – прямой выбор компонента,

.*’ – обращение к компоненту через указатель на него,

?:’ – условная операция,

::’ – операция указания области видимости,

‘sizeof’,

#’, ‘##’– препроцессорные операции.

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

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

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

6) Перегруженная операция не может иметь аргументы (операнды), заданные по умолчанию.

7) В языке С++ установлена идентичность некоторых операций, например, ++z– это тоже, что иz+=1. Эта идентичность теряется для перегруженных операций.

8) Функцию operatorможно вызвать по ее имени, например,z=operator*(x,y)илиz=x.operator*(y). В первом случае вызывается глобальная функция, во втором – компонентная функция классаХ, их– это объект классаХ. Однако, чаще всего функцияoperatorвызывается косвенно, например,z=x*y

9) За исключением перегрузки операций newиdeleteфункцияoperatorдолжна быть либо нестатической компонентной функцией, либо иметь как минимум один аргумент (операнд) типа “класс” или “ссылка на класс” (если это глобальная функция).

10) Операции ‘=’, ‘[]’, ‘–>’ можно перегружать только с помощью нестатической компонентной функцииoperator. Это гарантирует, что первыми операндами будут леводопустимые выражения.

11) Операция ‘[]’ рассматривается как бинарная. Пусть а– объект классаА, в котором перегружена операция ‘[]’. Тогда выражениеa[i]интерпретируется какa.operator[](i).

12) Операция ‘()’ вызова функции рассматривается как бинарная. Пустьа– объект классаА, в котором перегружена операция ‘()’. Тогда выражениеa(x1,x2,x3,x4)интерпретируется какa.operator()(x1,x2,x3,x4).

13) Операция ‘–>’ доступа к компоненту класса через указатель на объект этого класса рассматривается как унарная. Пустьа– объект классаА, в котором перегружена операция ‘–>’. Тогда выражениеa–>mинтерпретируется как(a.operator–>())–>m. Это означает, что функцияoperator–>()должна возвращать указатель на классА, или объект классаА, или ссылку на классА.

14) Перегрузка операций ‘++’ и ‘--‘, записываемых после операнда (z++, z--), отличается добавлением в функциюoperatorфиктивного параметраint, который используется только как признак отличия операцийz++иz--от операций++zи--z.

15) Глобальные операции newможно перегрузить и в общем случае они могут не иметь аргументов (операндов) типа “класс”. В результате разрешается иметь несколько глобальных операцийnew, которые различаются путем изменения числа и (или) типов аргументов.

16) Глобальные операции deleteне могут быть перегружены. Их можно перегрузить только по отношению к классу.

  1. Заданные в самом языке глобальные операции newиdeleteможно изменить, т.е. заменить версию, заданную в языке по умолчанию, на свою версию.

  2. Локальные функции operatornew() иoperatordelete() являются статическими компонентами класса, в котором они определены, независимо от того, использовался или нет спецификаторstatic(это, в частности, означает, что они не могут быть виртуальными).

  3. Для правильного освобождения динамической памяти под базовый и производный объекты следует использовать виртуальный деструктор.

  4. Если для класса Х операция “=” не была перегружена явно и xиy- это объекты класса Х, то выражениеx=yзадает по умолчанию побайтовое копирование данных объектаyв данные объектаx.

21) Функция operator вида operator type() без возвращаемого значения, определенная в классе А, задает преобразование типа А к типу type.

22) За исключением операции присваивания ‘=’ все операции, перегруженные в классеХ, наследуются в любом производном классеY.

23) Пусть Х– базовый класс,Y– производный класс. Тогда локально перегруженная операция для классаХможет быть далее повторно перегружена в классеY.

Соседние файлы в папке II cemecTP