
- •4.1. Общие сведения о перегрузке операторов
- •4.2. Общие особенности перегрузки бинарных и унарных операторов
- •Бинарные операторы
- •Унарные префиксные операторы
- •Унарные постфиксные операторы
- •Правила выбора места определения операторных функций
- •4.3. Перегрузка основных унарных операторов
- •Операторы префиксного и постфиксного инкрементов и декрементов
- •Операторы унарного плюса и минуса
- •Операторы преобразования типа
- •4.4. перегрузка основных бинарных операторов
- •Оператор присваивания
- •Составные операторы присваивания
- •Обычные арифметические и логические операторы
- •Операторы ввода и вывода
- •Оператор индексации
- •Оператор вызова функции

приведены примеры перегрузки основных операторов. Создание аналогичных операторных функций для любого другого класса будет, в основном, отличаться только алгоритмом вычисления результата операции.
Определение самого классаComplex можно найти на локальном сервере в папке дисциплины «ЯиМПр».
4.3. Перегрузка основных унарных операторов
Операторы префиксного и постфиксного инкрементов и декрементов
Обе формы данных операторов удобно определять членыкак класса. Перегрузка префиксной формы таких операторов не вызывает затруднений. Для класса Complex в случае инкремента это можно сделать, например, следующим образом:
Complex &Complex::operator++()
{
m_Re += 1;
return *this; // возвращается ссылка на левый операнд –
// |
объект-владелец вызова операторной функции |
|
|
} |
|
|
|
Перегрузка постфиксной формы требует создания в начале временного объекта класса и возврата в конце копии этого объекта:
Complex Complex::operator++(int)
{
Complex temp(*this); // локальный объект-копия операнда m_Re += 1;
return temp; // возвращается копия объекта temp
}
В отличие от префиксной формы здесьне следует использовать ссылкув качестве возвращаемого результата (почему?).
Как видно, префиксные инкремент и декремент выполняются быстрее постфиксных, т.к. не требуют двукратного копирования объектов класса.
Операторы унарного плюса и минуса
Оператор унарного плюса ничего не делает. Он нужен только для того, чтобы поддержать возможность использования унарного плюса в выражениях. Поэтому удобно сделать его встроенным внутри класса, причем так, чтобы он просто возвращал ссылку на объект-владелец. В случае класса Complex это может выглядеть так:
Complex & Complex::operator+() { return *this; }
Оператор унарного минуса создает новое значение объекта класса, противоположное по знаку по отношению к своему операнду. Т. к. оператор не изменяет объекта-владельца, то его лучше определять вне класса. В случае класса Complex это может выглядеть, например, так (оператор должен быть объявлен дружественным к классу):
Complex operator-(const Complex cz)
{
Complex temp(cz);
temp.m_Re = -temp.m_Re; temp.m_Im = -temp.m_Im; return temp;
}