Справочные данные по языку C++_____________________________651

)

// Перегруженная унарная операция вычитания

Complex Complex: .-operator-() const

(

Complex R;

R.Re = -Re;

R.Im = -Im;

return R;

// Перегруженная операция присваивания
Complex & Complex::operator=(const Complex &R)
(

Re = R.Re;

Im = R.Im;

return *this; // возможность сцепления
)

В этом классе вводится два открытых данных-элемента: Re — действительная
часть комплексного числа, и Im — мнимая часть. Конструктор по умолчанию зада-
ет действительную и мнимую часть равными 0.

Оператор

Complex operator+(const Complex &) const;

объявляет прототип бинарной операции сложения. На то, что это операция бинар-
ная, указывает наличие параметра — правого операнда. Когда компилятор встре-
тит в тексте операцию А + В, примененную к переменным типа Complex, он, не-
зримо для пользователя, заменит ее выражением A.operator+(B).
Оператор

Complex operator+() const;

объявляет прототип унарной операции сложения, поскольку список параметров
пуст.

Прототипы операций вычитания и присваивания строятся аналогично.

В реализации функции бинарного сложения создается локальная переменная
R типа Complex, в которой формируется возвращаемое значение. В процессе фор-
мирования к данным левого операнда производится обращение просто по именам
Re и Im, а второй операнд является параметром, передаваемым в функцию по
ссылке. В заключение значение сформированной переменной возвращается как ре-
зультат функции.

В функции операции присваивания просто данные параметра пересылаются в
поля Re и Im. Обратите внимание на последнюю строку, которая возвращает *this.
Указатель this является указателем на объект данного класса. Подобный возврат
ссылки необходим, чтобы можно было использовать сцепленные операции присва-
ивания. Рассмотрим это подробнее.

Если компилятор встречает в тексте выражение А = В, примененное к пере-
менным типа Complex, он заменяет его выражением A.operator=(B). А что прои-
зойдет, если встретится выражение А = В = С ? Поскольку ассоциативность опера-
ции присваивания справо налево, то сначала заменится вторая часть выражения
на B.operator=(C). После замены первого знака равенства получится выражение
A.operator=(B.operator=(C)). Для того, чтобы это работало, нужно, чтобы выраже-
ние возвращало ссылку на объект В. Это и делается, возвращением в функции
ссылки *this. Тогда обеспечивается правильное выполнение сцепленных присваи-
вании.