· Вводить собственные обозначения для операций, не совпадающие со стандартными операциями языка С++ , нельзя.
· Не все операции языка С++ могут быть перегружены. Нельзя перегрузить следующие операции:
o . – прямой выбор компонента,
o .* – обращение к компоненту через указатель на него,
o ?: – условная операция,
o :: – операция указания области видимости,
o sizeof’ – вычисление размера
o , – операция последовательного вычисления,
o #, ## – препроцессорные операции.
· Каждая операция, заданная в языке, имеет определенное число операндов, свой приоритет и ассоциативность. Все эти правила, установленные для операций в языке, сохраняются и для ее перегрузки, т.е. изменить их нельзя.
· Любая унарная операция Å определяется двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. Выражение Åz означает в первом случае вызов z.operatorÅ(), во втором- вызов operatorÅ(z).
· Любая бинарная операция Å определяется также двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае xÅy означает вызов x.operatorÅ(y), во втором – вызов operatorÅ(x,y).
· Перегруженная операция не может иметь аргументы (операнды), заданные по умолчанию.
· В языке С++ установлена идентичность некоторых операций, например, ++z – это тоже, что и z+=1. Эта идентичность теряется для перегруженных операций.
· Функцию operator можно вызвать по ее имени, например, z=operator*(x,y) или z=x.operator*(y). В первом случае вызывается глобальная функция, во втором – компонентная функция класса Х , и х – это объект класса Х. Однако, чаще всего функция operator вызывается косвенно, например, z=x*y
· За исключением перегрузки операций new и delete функция operator должна быть либо нестатической компонентной функцией, либо иметь как минимум один аргумент (операнд) типа “класс” или “ссылка на класс” (если это глобальная функция).
· Операции ‘=’, ‘[]’, ‘–>’ можно перегружать только с помощью нестатической компонентной функции operatorÅ. Это гарантирует, что первыми операндами будут леводопустимые выражения.
· Операция ‘[]’ рассматривается как бинарная. Пусть а – объект класса А, в котором перегружена операция ‘[]’. Тогда выражение a[i] интерпретируется как a.operator[](i).
· Операция ‘()’ вызова функции рассматривается как бинарная. Пусть а – объект класса А, в котором перегружена операция ‘()’. Тогда выражение a(x1,x2,x3,x4) интерпретируется как a.operator()(x1,x2,x3,x4).
· Операция ‘–>’ доступа к компоненту класса через указатель на объект этого класса рассматривается как унарная. Пусть а – объект класса А, в котором перегружена операция ‘–>’. Тогда выражение a–>m интерпретируется как (a.operator–>())–>m. Это означает, что функция operator–>() должна возвращать указатель на класс А, или объект класса А, или ссылку на класс А.
· Перегрузка операций ‘++’ и ‘--‘, записываемых после операнда (z++, z--), отличается добавлением в функцию operator фиктивного параметра int, который используется только как признак отличия операций z++ и z-- от операций ++z и --z.
· Глобальные операции new можно перегрузить и в общем случае они могут не иметь аргументов (операндов) типа “класс”. В результате разрешается иметь несколько глобальных операций new, которые различаются путем изменения числа и (или) типов аргументов.
· Глобальные операции delete не могут быть перегружены. Их можно перегрузить только по отношению к классу.
· Заданные в самом языке глобальные операции new и delete можно изменить, т.е. заменить версию, заданную в языке по умолчанию, на свою версию.
· Локальные функции operator new() и operator delete() являются статическими компонентами класса, в котором они определены, независимо от того, использовался или нет спецификатор static (это, в частности, означает, что они не могут быть виртуальными).
· Для правильного освобождения динамической памяти под базовый и производный объекты следует использовать виртуальный деструктор.
· Если для класса Х операция “=” не была перегружена явно и x и y - это объекты класса Х, то выражение x=y задает по умолчанию побайтовое копирование данных объекта y в данные объекта x.
· Функция operator вида operator type() без возвращаемого значения, определенная в классе А, задает преобразование типа А к типу type.
· За исключением операции присваивания ‘=’ все операции, перегруженные в классе Х, наследуются в любом производном классе Y.
· Пусть Х – базовый класс, Y – производный класс. Тогда локально перегруженная операция для класса Х может быть далее повторно перегружена в классе Y.