Займемся теперь реализацией остальных методов. Начнем с функции сложения! Как и ранее написанная функция сложения (см. листинг 1.4), метод очевидно должен возвращать значение типа TMoney. Функция AddMoneyO получала два аргумента-суммы. Но метод уже имеет доступ к одной сумме — это поле Summa в классе. Таким образом, параметр у метода AddMoneyO должен быть единственным. Параметр — это правый аргумент сложения. Чтобы разобраться, почему именно правый, вспомним, как вызываются методы класса:
объект.метод(параметры)
Вызов метода AddMoney () для некоторого объекта t типа TMoney может быть таким (естественно, результат нужно записать в другую переменную типа TMoney):
TMoney t, р; t.Init(lOe); p.Init(iee);
TMoney r = t.AddMoney(p); // г = t + p
Таким образом, в качестве левого операнда сложения используется денежная сумма того объекта, для которого вызывается метод, а второй операнд (правый) — это аргумент метода. С учетом этих соображений реализация метода (листинг 1.11) мало отличается от реализации функции.
Листинг 1.11. Определение метода AddMoneyO
TMoney TMoney::AddMoney(const TMoney &b)
{ TMoney t = b; // локальный объект
t.Summa += Summa; // просуммировали с суммой левого аргумента
return t; // возврат результата
}
Метод AddMoneyO можно реализовать по-другому, использовав тот объект, который стоит слева от точки-селектора (листинг 1.12).
Листинг 1.12. Другая реализация метода AddMoney() TMoney TMoney::AddMoney(const TMoney &b)
{ TMoney t = *this; // текущий объект - левый аргумент
t.Summa += b.Summa; // сложили с суммой правого аргумента
return t; // возврат результата
}
В методе мы объявили и инициализировали локальную переменную t текущим объектом, использовав ключевое слово this (см. п. п. 9.3.2 в [1]). Вот что пишет об этом Б. Страуструп [2]: «Каждая функция-член „знает", для какого объекта она вызвана, и может явно на него ссылаться..., ключевое слово this является указателем на объект, для которого вызвана функция». Фактически это означает, что каждый метод получает неявный дополнительный параметр — указатель на текущий объект.
ВНИМАНИЕ
Из этого общего правила есть исключения — статические методы, которые мы рассмотрим в главе 4. |