Логические операторы
Перегрузка унарных операторов
Перегрузка бинарных операторов
Перегрузка операторов
Уникальная возможность языка С++. Эта возможность позволяет свободно работать с АТД так же как со встроенными типами.
Для АТД complex | * - комплексное умножение |
+ - комплексное сложение | |
~ - комплексное сопряжение |
Комплексная арифметика, матричная алгебра, символьные строки - это лишь немногие примеры где удобно использовать перегруженные операторы.
z=x*y;
z=x.operator*(y); // явный вызов оператора
Исходя из этой записи нетрудно догадаться как осуществляется перегрузка операторов для АТД. Просто нужно определить функцию-член с именем operator* или любой другой оператор.
Но есть некоторые особенности:
- перегрузка бинарных операторов и смешанная арифметика
- перегрузка унарных операторов
- перегрузка оператора присваивания =
- оператор преобразования
- перегрузка индексирования ()
- перегрузка операторов ввода/вывода << и >>
- логические операторы
complex complex::operator*(const complex& other)
{
return complex(m_re*other.m_re-m_im*other.m_im, m_re*other.m_im-m_im*other.m_re);
}
complex complex::operator*(const double& other) // смешанная арифметика
{
return complex(m_re*other, m_im*other);
}
complex complex::operator-()
{
return complex(-m_re, -m_im);
}
complex complex::operator~() // сопряжение
{
return complex(m_re, -m_im);
}
bool complex::operator== (const complex& other)
{
if(m_re == other.m_re && m_im == other.m_im)
{
return true;
}
return false;
}
Перегрузку оператора присваивания следует выделить особо. Мы уже рассматривали функцию, которая позволяет инициализировать один экземпляр класса значениями переменных членов хранящихся в другом экземпляре. Это конструктор копирования. Оператор присваивания отличается тем, что новй класс при его выполнении не создаётся, а значения членов одного экземпляра присваиваются членам другого экземпляра. При перегрузке оператора присваивания необходимо руководствоваться следующими правилами:
- Аргументом перегруженного оператора присваивания должна быть неизменяемая ссылка на экземрляр данного класса (чтобы случайно не испортить экземпляр).
- Перед осуществлением присваивания необходимо осуществить проверку на присваивание самому себе (чтобы не выполнять лишних действий).
- Перегруженный оператор с присваиванием должен осуществлять почленное присваивание (то есть должно быть выполнено последовательное присваивание каждой переменной).
- Перегруженный оператор присваивания должен возвращать ссылку на самого себя (чтобы оно было похоже на присваивание вcтроенных типов данных, тогда будет возможна запись x = y = z = 1.).
complex& complex::operator=(const complex& other)
{
if(this!= &other)
{
m_re=other.m_re;
m_im=other.m_im;
}
return *this;
}
Перегрузка операторов с присваиванием осуществляется по следующим правилам:
- Аргументом перегруженного оператора с присваиванием должна быть неизменяемая ссылка на экземрляр данного класса (чтобы случайно не испортить операнд).
- Перегруженный оператор с присваиванием должен возвращать ссылку на самого себя.
complex& complex::operator*=(const complex& other)
{
complex temp=*this;
m_re=temp.m_re*other.m_re-temp.m_im*other.m_im;
m_im=temp.m_re*other.m_im+temp.m_im*other.m_re;
return (*this);
}