384 ____________Часть III. Современное программирование на C++
поэтому ей требуется два аргумента (это отнюдь не означает, что аргументы должны передаваться через список; но об этом позже).
В строках 19—23 определена операция « и ее поведение с объектами INT.
Основная функция (строки 24—29) создает два объекта, инициализирует третий суммой этих двух и выводит все объекты на монитор. Обратите внимание, что синтаксис вывода совершенно одинаковый как для строковых констант, вроде "а= ", так и для членов класса INT.
Трассировка программы. Программу можно трассировать в IDE с помощью клавиши <F7>. Результат вывода в главной программе выглядит так:
а = 5 b =6 с = 11
Программа стартует со строки, содержащей функцию main. Оператор INT а (5), ь (б); заставляет программу произвести два независимых вызова конструктора. В строке INT с = а + b; происходит неявный вызов оператор-функции +, возвращающей объект типа INT. Этот объект затем используется для инициализации объекта с посредством вызова сгенерированного компилятором конструктора копий (см. главу 17).
Это надо знать. Функции operator+ и operator« могут быть сделаны членами класса, но, к сожалению, это вызовет ряд проблем. Во-первых: функция operator+ должна иметь доступ к элементам типа INT. Если операция будет членом класса, то такой доступ обеспечен, но проблемы не в этом.
Если оператор-функции являются членами класса, то им требуется только один аргумент. Так, объявление operator+ будет выглядеть следующим образом:
INT operator+ ( const INTS rhs) ;
а его определение примерно так:
INT INT::operator+ (const INT& rhs) (
INT t = data + rhs.data;
// эквивалентно: INT = this->data + rhs.data;
return t;
)
Причина сокращения числа аргументов состоит в том, что левым операндом является сам вызывающий объект. Возвратимся к нашей главной функции:
INT с = а + b; // где а и b — объекты типа IMT
t
Объект а — вызывающий (тот, на который ссылается указатель this), a b — передаваемый аргумент (формальный аргумент rhs). Проблемы появятся, как только мы слегка модифицируем класс. Рассмотрим:
INT с = а + b;