Обратите внимание еще и на то, что аргументом при сложении является текущий объект — он имеет тип ТМопеу, поэтому у компилятора «вопросов не возникает». Последний оператор можно написать и по-другому:
return (*this).AddMoney(t);
Скобки вокруг *this писать обязательно, так как операция «точка»1 имеет более высокий приоритет, чем операция «звездочка», поэтому без скобок мы получим указатель, а не объект типа TMoney — компилятор, естественно, «заругается».
Реализуем еще метод умножения на константу. Этот метод отличается от метода деления на константу только операцией. И в том, и в другом требуется округлять результат (до целых копеек), поэтому мы реализуем приватную функцию округления round () — округляется абсолютное значение денежной суммы. Текст функции и метода приведен в листинге 1.14.
Листинг 1.14. Метод умножения на константу
// Функция округления - в приватной части класса long double round(const long double &r)
{ long double t = fabs(r); // абсолютная сумма
t = (t-floor(t)<0.5)?floor(t):ceil(t); // округляем
return (r<0)?-t:t; // возвращаем со знаком
}
// метод
TMoney TMoney::MultByNumber(const double &b) { TMoney t = *this;
if (b>0) t.Summa = round(Summa*b); // в методе деления Summa/b
return t;
}
Обычно константой является некоторый коэффициент перевода одной валюты в другую, и это число всегда положительное. Именно поэтому в методе проверяется «положительность» аргумента. |