650_____________________________________________Глава 11

ция присваивания сводится к побитовому копированию данных-элементов класса.
Такое побитовое копирование опасно для классов с элементами, которые указыва-
ют на динамически выделенные области памяти; для таких классов следует явно
перегружать операцию присваивания. Операция адресации (&) также может быть
использована с объектами любых классов без перегрузки; она просто возвращает
адрес объекта в памяти. Но операцию адресации можно также и перегружать.

Перегрузка не может изменять старшинство и ассоциативность операций. Не-
льзя также изменить число операндов операции. Например, унарную операцию
можно перегрузить только как унарную.

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

Цель перегрузки операций состоит в том, чтобы обеспечить такие же краткие
выражения для типов, определенных пользователем, какие C++ обеспечивает с по-
мощью богатого набора операций для встроенных типов. Однако, перегрузка опе-
раций не выполняется автоматически; чтобы выполнить требуемые операции, про- |
граммист должен написать функции, осуществляющие перегрузки операций.   J

Хороший стиль программирования

Перегружайте операции так, чтобы они выполняли над объектами вашего класса ту же ф^^Н
кцию или близкие к ней функции, что и операции, выполняемые над объектами встроенш^^В
типов.                                                                 • 4^^И

Ниже приведен упрощенный пример создания класса комплексных чис^^И
Complex, в котором переопределены операции сложения, вычитания и присваивали
ния. Дается описание не всех функций, поскольку очевидно, что сложение и выч^И
тание — операции идентичные с точностью до знака.                      •И

class Complex (                                                     ^U|

double Re;                                // действительная часть • ЯП
double Im;                                // мнимая часть           ^^В
Complex(double = 0.0, double = 0.0);      //конструктор            ^^В

// операции сложения                                                 ^^В
Complex operator-)- (const Complex &) const; // бинарная              ^^И
Complex operator+() const;                // унарная               i^^H

// операции вычитания                                               ^^В
Complex operator-(const Complex &) const; // бинарная              ^^^Н
Complex operator-() const;                // унарная               ^^И
Complex &operator=(const Complex &);      // присваивание          ^^В

Complex::Complex(double R, double I)                                 ^^H

// Перегруженная бинарная операция сложения                         ^^В
Complex Complex::operator+(const Complex &X) const                  ^^^H