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

Ключевое слово operator объявляет функцию, указывающую, что означает оператор-символ при применении к экземплярам класса. Это дает оператору более одного значения — "перегружает" его. Компилятор различает разные значения оператора, проверяя типы его операндов.

Синтаксис

typeoperatoroperator-symbol(parameter-list)

Замечания

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

Имя перегруженного оператора — operatorx, где x — оператор, как показано в следующей таблице. Например, чтобы перегрузить оператор сложения, необходимо определить функцию с именем operator+. Аналогичным образом, чтобы перегрузить оператор добавления или назначения, +=определите функцию, называемую оператором +=.

Переопределяемые операторы

Оператор Имя. Тип
, Comma Binary
! Логическое НЕ Унарный
!= Неравенство Binary
% Модуль Binary
%= Назначение модуля Binary
& Побитовое И Binary
& Взятие адреса Унарный
&& Логическое И Binary
&= Назначение побитового И Binary
( ) Вызов функции
( ) Оператор приведения Унарный
* Умножение Binary
* Разыменование указателя Унарный
*= Присваивание умножения Binary
+ Дополнение Binary
+ Унарный плюс Унарный
++ Добавочный 1 Унарный
+= Присваивание сложения Binary
- Вычитание Binary
- Унарное отрицание Унарный
-- Декремент 1 Унарный
-= Присваивание вычитания Binary
-> Выбор члена Binary
->* Выбор указателя на член Binary
/ Подразделение Binary
/= Присваивание деления Binary
< Меньше Binary
<< Сдвиг влево Binary
<<= Сдвиг влево и присваивание Binary
<= Меньше или равно Binary
= Передача прав и обязанностей Binary
== Equality Binary
> Больше Binary
>= Больше или равно Binary
>> Сдвиг вправо Binary
>>= Сдвиг вправо и присваивание Binary
[ ] Индекс массива
^ Исключающее ИЛИ Binary
^= Исключающее ИЛИ/присваивание Binary
| Побитовое ИЛИ Binary
|= Назначение побитового включающего ИЛИ Binary
|| Логическое ИЛИ Binary
~ Дополнение до единицы Унарный
delete DELETE
new Новый
операторы преобразования операторы преобразования Унарный

1 Две версии унарных операторов добавочного и декремента существуют: preincrement и postincrement.

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

Операторы, перечисленные в следующей таблице, не могут быть перегружены. Таблица содержит символы # препроцессора и ##.

Непереопределяемые операторы

Оператор Имя.
. Выбор члена
.* Выбор указателя на член
:: Разрешение области
? : Условный
# Препроцессор: преобразование в строку
## Препроцессор: конкатенация

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

Point pt;
pt.operator+( 3 );  // Call addition operator to add 3 to pt.

Пример

В следующем примере оператор перегружает + два сложных числа и возвращает результат.

// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct Complex {
   Complex( double r, double i ) : re(r), im(i) {}
   Complex operator+( Complex &other );
   void Display( ) {   cout << re << ", " << im << endl; }
private:
   double re, im;
};

// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
   return Complex( re + other.re, im + other.im );
}

int main() {
   Complex a = Complex( 1.2, 3.4 );
   Complex b = Complex( 5.6, 7.8 );
   Complex c = Complex( 0.0, 0.0 );

   c = a + b;
   c.Display();
}
6.8, 11.2

В этом разделе

См. также

Операторы C++, приоритет и ассоциативность
Ключевые слова