Собственно, ссылки (см. п. п. 8.3.2 в [1]) были добавлены в С++ во многом именно для обеспечения возможности перегрузки операций присваивания [43].
Таким образом, правильный заголовок метода-операции в данном случае должен быть таким:
ТМопеу& ТМопеу::operator+=(const ТМопеу &Ь)
Реализация операции остается без изменений. Вообще говоря, любая операция, возвращающая неконстантную ссылку, является многократной (повторяемой). Но повторное использование можно и явным образом запретить, если возвращать константную ссылку, например:
const ТМопеу& ТМопеу::operator+=(const ТМопеу &Ь)
Модификатор const запрещает дальнейшую модификацию результата.
С помощью операции += можно реализовать «чистое» сложение (листинг 3.5).
Листинг 3.5. Реализация операции + с помощью операции +=
ТМопеу ТМопеу::operator+(const ТМопеу &Ь) { ТМопеу t=*this;
t+=b; // работает реализованная операция
return t;
}
1 Вспомните прототип операции присваивания, приведенный в главе 1.
Аналогично реализуются операции вычитания, поэтому текст этих функций приводить не будем.
Конечно, в данном случае это — менее эффективное решение, чем приведенное в листинге 3.2. Однако для более «сложных» классов, чем денежный, использование реализованного метода по разным причинам может оказаться выгоднее применения встроенных операций. Опытные программисты всегда так поступают: реализуют одну операцию «вручную», а родственные — на основе уже реализованной. Таким способом снижается вероятность совершить ошибку, так как использование уже реализованной операции упрощает реализацию остальных. Кроме того, при возможных дальнейших изменениях операции сложения с присваиванием «чистую» операцию сложения изменять не потребуется.
СОВЕТ
Реализуем теперь операции деления (/) и деления с присваиванием (/=). Есть два варианта деления денежных сумм: деление денег на деньги и деление денег на дробную константу. Первый вариант деления имеет результатом дробную константу и не изменяет значение левого аргумента (текущего объекта), поэтому не может быть делением с присваиванием. Следовательно, деление с присваиванием — это деление на дробную константу. Как мы уже знаем, возвращаемым результатом должна быть ссылка на объект.
«Чистая» операция деления тогда у нас будет перегружена: деление денег на дробную константу и деление денежных сумм. Первая реализуется с помощью операции деления с присваиванием, а вторая — независимо. Текст всех трех функций приведен в листинге 3.6.
Листинг 3.6. Методы-операции деления
ТМопеу& ТМопеу::operator/=(const double &b) { if (b > 0)
{ bool negative = (Summa < 0);
Summa = round(Summa/b);
if (negative) Summa = -Summa:
}
return *this;
}
TMoney TMoney::operator/(const double &b) { TMoney t = *this;
t/=b; // реализованная операция
return t;
}
long double TMoney::operatior/(const TMoney &b) { long double t = 0.0;
if (b.Summa!=0) t = fabs(Summa)/fabs(b.Summa);
return t;
}
В «чистой» операции деления на константу мы не проверяем параметр — это делает операция деления с присваиванием, с помощью которой мы и вычисляем требуемое значение.
http://codingrus.ru/readarticle.php?article_id=5342
http://codingrus.ru/readarticle.php?article_id=5343
http://codingrus.ru/readarticle.php?article_id=5375
http://codingrus.ru/readarticle.php?article_id=5387
http://codingrus.ru/readarticle.php?article_id=5399
http://codingrus.ru/readarticle.php?article_id=5412
http://codingrus.ru/readarticle.php?article_id=5414
http://codingrus.ru/readarticle.php?article_id=5415
http://codingrus.ru/readarticle.php?article_id=5417
http://codingrus.ru/readarticle.php?article_id=5248
http://codingrus.ru/readarticle.php?article_id=5221
http://codingrus.ru/readarticle.php?article_id=5051
http://codingrus.ru/readarticle.php?article_id=4841 |