C++/Перегрузка операторов

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

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

В C++ в отличие от C разрешено перегружать операторы для свои типов.

При перегрузке операторов в C++ всё ниже перечисленное делать нельзя:

  • перегружать операторы для встроенных типов, т.е. перегружать операторы можно только для пользовательских типов;
  • перегружать следующие операторы: . .* :: ?: sizeof ..._cast<>() typeid();
  • придумывать свои лексемы для операторов, т.е. перегружать можно только предопределённые операторы;
  • менять ассоциативность перегружаемого оператора;
  • менять приоритет;
  • перегружать вне класса следующие операторы: = [] () -> (type), т.е. перегружать их можно только как члены класса.

Разрешается, но не рекомендуется перегружать следующие операторы: && || ,.

Перегрузка оператора декларируется ключевым словом operator, после которого следует сам перегружаемый оператор.

Перегрузка бинарного оператора

BigInt operator+(BigInt const & a, BigInt const & b) {}

Перегружать оператор можно как в классе, так и в основной рабочей области. При использовании оператора с пользовательским типом компилятор сперва ищет определение перегрузки оператора в классе первого операнда, если определение найдено, то "метод" перегрузки вызывается для операнда (объекта). Если в классе определение перегрузки оператора не найдено, то оно ищется в текущем пространстве имён. Если определение есть в двух местах то происходит ошибка выбора перегрузки.