Присваивание

Логические операторы

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

Перегрузка бинарных операторов

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

Уникальная возможность языка С++. Эта возможность позволяет свободно работать с АТД так же как со встроенными типами.

Для АТД complex * - комплексное умножение
  + - комплексное сложение
  ~ - комплексное сопряжение

Комплексная арифметика, матричная алгебра, символьные строки - это лишь немногие примеры где удобно использовать перегруженные операторы.

z=x*y;
z=x.operator*(y); // явный вызов оператора

Исходя из этой записи нетрудно догадаться как осуществляется перегрузка операторов для АТД. Просто нужно определить функцию-член с именем operator* или любой другой оператор.

Но есть некоторые особенности:

  1. перегрузка бинарных операторов и смешанная арифметика
  2. перегрузка унарных операторов
  3. перегрузка оператора присваивания =
  4. оператор преобразования
  5. перегрузка индексирования ()
  6. перегрузка операторов ввода/вывода << и >>
  7. логические операторы

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;
}

Перегрузку оператора присваивания следует выделить особо. Мы уже рассматривали функцию, которая позволяет инициализировать один экземпляр класса значениями переменных членов хранящихся в другом экземпляре. Это конструктор копирования. Оператор присваивания отличается тем, что новй класс при его выполнении не создаётся, а значения членов одного экземпляра присваиваются членам другого экземпляра. При перегрузке оператора присваивания необходимо руководствоваться следующими правилами:

  1. Аргументом перегруженного оператора присваивания должна быть неизменяемая ссылка на экземрляр данного класса (чтобы случайно не испортить экземпляр).
  2. Перед осуществлением присваивания необходимо осуществить проверку на присваивание самому себе (чтобы не выполнять лишних действий).
  3. Перегруженный оператор с присваиванием должен осуществлять почленное присваивание (то есть должно быть выполнено последовательное присваивание каждой переменной).
  4. Перегруженный оператор присваивания должен возвращать ссылку на самого себя (чтобы оно было похоже на присваивание в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;
}

Перегрузка операторов с присваиванием осуществляется по следующим правилам:

  1. Аргументом перегруженного оператора с присваиванием должна быть неизменяемая ссылка на экземрляр данного класса (чтобы случайно не испортить операнд).
  2. Перегруженный оператор с присваиванием должен возвращать ссылку на самого себя.

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);
}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: