Бинарные операторы
Операторы, работающ ие с двумя операндами, называются бинарными операторами (binary operator). Определение бинарного оператора, реализованного как глобальная функ ция или статическая функция-член, имеет следующий вид:
тип_возвращаемого_значения тип_оператора (параметр1, параметр2) ;
Определение бинарного оператора, реализованного как член класса, имеет следующий вид:
тип_возвращаемого_значения тип_оператора (параметр);
Бинарный оператор получает только один параметр в версии члена класса, потому что второй параметр обычно является атрибутом самого класса.
Типы бинарных операторов
Бинарные операторы, которые могут быть перегружены или переопределены в при ложении C++, приведены в табл.* 12.2.
ТАБЛИЦА 12.2. Перегружаемые бинарные операторы
Оператор Название
Запятая
I =
|
Неравенство
|
|
О,
|
Деление по модулю
|
о
|
О ,__
|
Деление по модулю с присвоением
|
О —
|
&
|
Побитовое AND
|
&&
|
Логическое AND
|
&=
|
Побитовое AND с присвоением
|
★
|
Умножение
|
|
* =
|
Умножение с присвоением
|
|
+
|
Сложение
|
+=
|
Сложение с присвоением
|
-
|
Вычитание
|
-=
|
Вычитание с присвоением
|
-> *
|
Косвенное обращ ение к указателю на член класса
|
Окончание табл. 12.2
Оператор Название
Деление
/= Деление с присвоением
Меньше
Сдвиг влево
« =
|
Сдвиг влево с присвоением
|
<=
|
М еньш е или равно
|
Присвоение, присвоение копии и присвоение перемещения
Равенство
Больше
>= Больше или равно
Сдвиг вправо
» =
|
Сдвиг вправо с присвоением
|
А
|
Исключающее OR
|
|
А __
|
Исключающее OR с присвоением
|
|
1
|
Побитовое OR
|
| =
|
Побитовое OR с присвоением
|
11
|
Логическое OR
|
[]
|
Оператор индексирования
|
Создание бинарных операторов сложения (а + Ь) и вычитания (а - Ь)
Подобно операторам инкремента и декремента, бинарные операторы “плю с” и “ми нус”, будучи определены, позволяют добавлять и вычитать значения поддерживаемого типа данных из объекта класса, который реализует эти операторы. Вернемся к нашему календарному классу D ate . Хотя мы уже реализовали в нем возможность инкремента, переводящего календарь на один день вперед, он еще не поддерживает возможность пере вода, скажем, на пять дней вперед. Для этого необходимо реализовать бинарный оператор (+), как демонстрирует код листинга 12.5.
И СТИ Н Г 1 2 .5 . Календарный класс с бинарным оператором суммы__________________________
#include
using namespace std;
:
class Date
{
private:
int Day, Month, Year;
public:
9:
10:
314 ЗАНЯТИЕ 12. Типы операторов и их перегрузка
Date (int InputDay, int InputMonth, int InputYear)
: Day (InputDay), Month (InputMonth), Year (InputYear) {};
// Бинарный оператор суммы
15: Date operator + (int DaysToAdd)
{
Date newDate (Day + DaysToAdd, Month, Year);
return newDate;
}
2 0 :
// Бинарный оператор вычитания
22: Date operator - (int DaysToSub)
{
return Date(Day - DaysToSub, Month, Year);
}
26:
void DisplayDate ()
{
29: cout « Day « " / " « Month « " / " « Year « endl;
}
};
int main ()
{
// Создать экземпляр и инициализировать его // датой 25 декабря 2011 года
Date Holiday (25, 12, 2011);
37:
cout « "Holiday on: ";
Holiday.DisplayDate ();
Date PreviousHoliday (Holiday - 19);
cout « "Previous holiday on: ";
PreviousHoliday.DisplayDate();
44:
Date NextHoliday(Holiday + 6);
cout « "Next holiday on: ";
NextHoliday.DisplayDate ();
return 0;
}
Результат
Holiday on: 25 / 12 / 2011
Previous holiday on: 6 / 12 / 2011
Next holiday on: 31 / 12 / 2011
Анализ
Строки 14-25 содержат реализации бинарных операторов (+) и (-), которые позволяют использовать синтаксис простого сложения и вычитания, как можно заметить в строках 41 и 45 функции m ain ().
Бинарный оператор суммы также был бы очень полезен в случае создания строкового класса. На занятии 9, “Классы и объекты”, мы уже анализировали простой класс оболочки строки M y S trin g , инкапсулирующий управление памятью, копирование и так далее для символьной строки стиля С (см. листинг 9.9). Но что не поддерживает этот класс, так это конкатенацию двух строк с использованием следующего синтаксиса:
MyString Hello("Hello ") ;
MyString World(" World");
MyString HelloWorld(Hello + World); // ошибка: оператор + не определен
Само собой разумеется, оператор (+) чрезвычайно упростил бы использование класса
M yS tring, а следовательно, он стоит потраченных на него усилий:
MyString operator* (const MyString& AddThis)
{
MyString NewString;
if (AddThis.Buffer != NULL)
{
NewString.Buffer = new char[GetLength() \
strlen(AddThis.Buffer) + 1];
strcpy(NewString.Buffer, Buffer); strcat(NewString.Buffer, AddThis.Buffer);
}
return NewString;
}
Чтобы получить возможность использовать синтаксис сложения, добавьте приведен ный выше код в листинг 9.9 с закрытым стандартным конструктором M y S trin g () и пу стой реализацией. Вы можете увидеть версию класса M y S trin g с оператором (+) среди прочих в листинге 12.12.
Операторы обеспечивают удобство и простоту использования класса. Однако необходимо реализовать только те из них, которые имеют смысл. Обратите вни мание, что для класса Date мы реализовали операторы сложения и вычитания,
для класса MyString только оператор суммы (+). Поскольку выполнение операций вычитания со строками весьма мало вероятно, такой оператор не нашел бы применения.
Реализация операторов сложения с присвоением (+=)и вычитания с присвоением (-=)
Операторы сложения с присвоением обеспечивают такой синтаксис, как “а += Ь ; ”, позволяющий программисту увеличивать значение объекта а на значение Ь. Преимущ е ство оператора сложения с присвоением в том, что он может быть перегружен так, чтобы получать параметры b различных типов. Приведенный ниже листинг 12.6 позволяет до бавлять целочисленное значение к объекту CDate.
316 ЗАНЯТИЕ 12. Типы операторов и их перегрузка
ЛИСТИНГ 12.6. Определение операторов (+=) и (-=)
для добавления и вычитания введенных дней_______________________________
#include
using namespace std;
2 :
class Date
{
private:
int Day, Month, Year;
public:
9:
// Конструктор, инициализирующий объект днем, месяцем и годом
Date (int InputDay, int InputMonth, int InputYear)
: Day (InputDay), Month (InputMonth), Year (InputYear) {};
// Бинарный оператор сложения с присвоением
void operator+= (int DaysToAdd)
{
Day += DaysToAdd;
}
19:
// Binary subtraction assignment
void operator-= (int DaysToSub)
22: {
Day -= DaysToSub;
}
25:
void DisplayDate ()
{
28: cout « Day « " / " « Month « " / " « Year « endl;
}
};
Do'stlaringiz bilan baham: |