Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

6.2.6. Перегрузка операторов с присваиванием

Перегрузка операторов с присваиванием (+=, *= и т.д.) осуществляется по следующим правилам:

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

}

// пример использования

Complex x, y;

x*=y;

6.2.7. Перегрузка преобразования типов

Преобразовать встроенный тип данных к нашему абстрактному типу можно при помощи конструктора (см. раздел 6.1.2). А чтобы преобразовать абстрактный тип данных к встроенному типу, необходимо перегрузить оператор:

// преобразование типа Complex в double

Complex::operator double() const

{

return (m_re*m_re-m_im*m_im);

}

// пример использования

Complex x;

double y;

y=double(x);

6.2.8. Перегрузка оператора доступа по индексу

Для некоторых классов, которые хранят массивы (например, матрица) для удобного доступа к элементу массива по его индексу можно перегрузить оператор ():

// оператор доступа по индексу

double& matrix::operator() (int i, int j)

{

return (p[i][j]); // или p[i*size+j];

}

// пример использования

matrix x;

double y;

y=matrix(1,1); // доступ к элементу (1,1)

6.2.9. Перегрузка операторов ввода/вывода

Перегрузку операторов ввода/вывода приходится оформлять в виде дружественных функций класса.

Это происходит из-за того, что при использовании оператора ввода или вывода слева от него должен находиться экземпляр потока ввода/вывода, то есть перегруженные операторы ввода/вывода являются членами потоков, а не других классов. Вмешаться во внутреннюю реализацию потоков мы не можем, но можем использовать функции, которые не являются членами классов, но позволяют получить доступ к их скрытым (private) членам.

// oписание:

friend ostream& operator<< (ostream& out, const Complex& x);

friend istream& operator>> (istream& out, Complex& x);

// вывод комплексного числа на экран

ostream& operator<< (ostream& out, const Complex& x)

{

return (out<<"("<<x.m_re<<","<<x.m_im<<")");

}

// ввод комплексного числа с клавиатуры

istream& operator>> (istream& in, Complex& x)

{

return (in>>x.m_re>>x.m_im);

}

// пример использования

Complex x;

cout<<x<<endl;

6.2.10. Неперегружаемые операторы

Не могут быть перегружены следующие операторы:

  • Оператор:: (левый и правый операнд являются не значениями, а именем)

  • Оператор. (правый операнд является именем)

  • Оператор.* (правый операнд является именем)

  • Оператор? : (арифметический оператор имеет специфическую семантику)

  • Оператор new (операнд является именем, кроме того выполняет небезопасную процедуру)

  • Оператор delete (не используется без new, кроме того выполняет небезопасную процедуру)

Кроме того, с помощью механизма перегрузки можно переопределить только существующие операторы. Новые операторы определить невозможно.