Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 24. Перегрузка операторов 265




Я осознаю, что это слабый аргумент, тем не менее перегрузка операторов может быть полезной. Допустим, у нас есть  класс                                                           который представляет вечнозеленые американские доллары. Некоторые операторы не имеют никакого смысла в применении к долларам. какую смысловую нагрузку будет нести инверсия (оператор в применении к долларам? Перевернуть бумажку на другую сторону? Обменять на гривну? С другой стороны, некоторые операторы явно применимы к этому классу. Например, имеет смысл складывать или вычитать объекты класса USDollar — результатом будет тот же USDollar. Кроме того, имеет смысл умножать или делить USDollar на два. Или три. Но очень трудно себе представить умножение USDollar на USDollar...

Перегрузка простых арифметических операторов для класса 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; Просмотров: 193; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.011 с.)
Главная | Случайная страница | Обратная связь