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

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

type operator operator-symbol ( parameter-list )

Заметки

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

Перегруженный оператор имеет имя operatorx, где x означает оператор из следующей таблицы. Например, для перегрузки оператора сложения необходимо определить функцию operator+. Аналогично, для сложения/присвоения += необходимо определить функцию 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

==

Равенство

Binary

>

Больше

Binary

>=

Больше или равно

Binary

>>

Сдвиг вправо

Binary

>>=

Сдвиг вправо и присваивание

Binary

[ ]

Нижний индекс массива

^

Исключающее ИЛИ

Binary

^=

Исключающее ИЛИ/присваивание

Binary

|

Побитовое включающее ИЛИ

Binary

|=

Назначение побитового включающего ИЛИ

Binary

||

Логическое ИЛИ

Binary

~

Дополнение до единицы

Унарный

delete

Delete

new

New

conversion operators

операторы преобразования

Унарный

1   Существуют две версии унарных операторов инкремента или декремента: префиксная и постфиксная.

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

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

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

Operator

Name

.

Выбор члена

.*

Выбор указателя на член

::

Разрешение области

? :

Условие

#

Препроцессор: преобразование в строку

##

Препроцессор: конкатенация

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

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++

Ключевые слова в C++