|
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Глава 24. Перегрузка операторов 265
Перегрузка простых арифметических операторов для класса USDollar может значительно улучшить читаемость программы. Сравните два приведенных ниже фрагмента кода: //expense — посчитать количество уплаченных денег // (учитывая проценты и требуемую сумму) USDollar principle , double rate) { //подсчитаем USDollar interest = //добавим это к требуемой сумме //и вернем результат return ,- } Если перегрузить операторы, эта же функция примет такой вид: //expense — посчитать количество уплаченных денег // (учитывая проценты и требуемую сумму) USDollar principle, double rate) { USDollar interest = return + Ну как, красиво? Однако, прежде чем вы научитесь перегружать операторы, вы должны понять взаимосвязь между оператором и
На секунду задумайтесь над тем, что такое оператор? Ведь это не более чем встро- енная функция со своеобразным синтаксисом. Например, какая разница между а+Ь и Или, например, Никакой. Между прочим, в некоторых языках сложение именно так и происходит. C++ дает каждому оператору специальное функциональное имя, которое состоит из ключевого слова operator , следующего за ним символа оператора и расположен- ных после него соответствующих типов аргументов. Например, оператор +, который выполняет сложение двух переменных типа in t и лает на выходе int , по сути, вызы- вается как функция: in t operator+(int , int) . Оператор, складывающий целочисленные значения, отличается от оператора, скла- дывающего значения типа double (он будет выглядеть как double opera - (double, double)). Это не так трудно понять, если вспомнить, что внутренний формат переменной типа in t отличается от формата переменной типа double. Вы не можете изобретать новые операторы либо изменять приоритет или фор- мат существующих операторов. Кроме того, нельзя переопределять операторы для
266 Часть V. Полезные особенности встроенных типов. Вы также вряд ли сможете внятно объяснить, что такое сложе- ние двух целочисленных значений (если, конечно, не имеете соответствующей ученой Приведенные ниже примеры демонстрируют, как могут быть определены операто- ры сложения и инкремента для класса USDollar (я мог бы реализовать такие же функции и для канадских долларов, но тогда мне бы понадобился канадец для прида- ния комментариям канадского акцента). // — объект, который содержит целое число долларов // плюс целое число Сто центов равны // одному доллару class friend USDollar ; friend
public: int d, unsigned int c) ;
protected:
int int
// конструктор
{ dollars = d; cents = c; while (cents >= 100) dollars++; cents -= 100;
int d, int c)
// складывает с и возвращает // результат в виде нового объекта USDollar USDollarS s2) { int + int = + USDcJlar d(dollars, cents); return d;
// operator++ — увеличивает указанный аргумент, // изменяя значение объекта USDollarS s) {
if >= 100) ! 100;
return |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 221; Нарушение авторского права страницы