Какие операторы можно перегружать в C++? Можно ли создавать собственные (ранее не представленные) операторы?

Собственные операторы в C++ создавать нельзя, а можно только перегружать существующие (не все, но многие). Такое ограничение вызвано прежде всего тем, что синтаксический анализатор языка с созданием каждого нового оператора пришлось бы тоже учить как-то его распознавать (проверять корректность использования и т.д.).

Перечень операторов доступных для перегрузки:

+       —       *       /       %       ^       &       |

~       !       ,       >=      <=      >       <       =

++      —      <<      >>      ==      !=      &&      ||

+=      -=      /=      %=      ^=      &=      |=      *=

<<=     >>=     [ ]     ( )     ->      ->*     new     delete

Даже среди существующих операторов есть такие, которые нельзя перегрузить. Например, оператор разрешения области видимости :: или оператор ., используемый для обращения к полям и методам объекта.

Перегрузка операторов не всегда является процедурой необходимой. Во многих современных языках такой возможности нет (например, в Java).

Во-первых, перегружая оператор можно наделить его не очевидным смыслом для всех прочих разработчиков, кроме автора программы. Например, логичным является перегрузка оператора + для класса строк (он может использоваться для склейки / объединения / конкатенации двух и более строк), но какой результат должен давать, например, оператор * примененный к двум строкам?

Во-вторых, перегрузка оператора в контексте конкретной задачи (конкретного класса) может получиться неоднозначной. Например, если для класса векторов мы перегружаем оператор *, то результатом должно быть векторное или скалярное произведение?

Поделиться
Обновлено: Октябрь 23, 2018 — 19:02

Добавить комментарий