Перегрузка операторов
Ключевое operator
слово объявляет функцию, указывающую, что означает оператор-символ при применении к экземплярам класса. Это дает оператору более одного значения — "перегружает" его. Компилятор различает разные значения оператора, проверяя типы его операндов.
Синтаксис
type operator-symbol (параметр-list)
operator
Замечания
Функцию большинства встроенных операторов можно переопределить глобально или для отдельных классов. Перегруженные операторы реализуются в виде функции.
Имя перегруженного оператора — operator
x, где 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 |
Удаление | — |
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