Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 121

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 115 116 117 118 119 120 < 121 > 122 123 124 125 126 127 .. 341 >> Следующая


с2 = cl++:

Здесь Cl увеличивается до 3, но переменной с2 значение переменной cl было присвоено до ее увеличения. Поэтому переменная с2 имеет значение 2.

Конечно же, мы можем использовать различные варианты записи операции и для operator—.

Перегрузка бинарных операций

Бинарные операции могут быть перегружены так же, как и унарные операции. Мы рассмотрим примеры перегрузки арифметических операций, операций сравнения и операции присваивания.

Арифметические операции

В программе ENGLC0N из главы 6 мы рассматривали два объекта класса Distance, которые складывались с помощью метода add_dist(): dist3.add_dist ( distl. dist2 ):

Используя перегрузку операции +, мы можем отказаться от этого неприглядного выражения и воспользоваться таким:

dist 3 - distl + dist2;

В листинге программы ENGLPLUS реализована эта возможность:

// engplus.cpp

// перегрузка операции + для сложения переменных типа Distances !include <iostream> using namespace std: /////////////////////////////////////////////////////////// class Distance // класс английских мер длины

I

private: • int feet:

float inches: public:

// конструктор без параметров

Distance ( ) : feet ( 0 ). inches ( 0.0 ) { }

// конструктор с двумя параметрами

Distance ( int ft. float in ) : feet ( ft ). inches ( in ) { }

// получение информации or пользователя

void getdist ( ) {

cout « "\пВведите футы: ": сіп » feet; cout « "Введите дюймы: ": сіп » inches; Перегрузка бинарных операций_321

}

// показ информации void showdist ( )

{ cout « feet « "V-" « inches « '\"': } // сложение двух длин Distance operator+ ( Distance ) const:

}:

/////////////////////////////////////////////////////////// // сложение двух длин

Distance Distance::operator+ ( Distance d2 ) const {

int f = feet + d2.feet: // складываем футы

float і = inches + d2.inches: // складываем дюймы

if ( і >= 12.0 ) // если дюймов стало больше 12

{

і -= 12.0: // то уменьшаем дюймы на 12

f++: // и увеличиваем футы на 1

}

return Distance С f. і ): // создаем и возвращаем временную переменную

}

///////////////////////////////////////////////////////////

int main ( ) {

Distance distl, dist3, dist4: // определяем переменные

distl.getdist (): // получаем информацию

Distance dist2 ( 11, 6.25 ): // определяем переменную с конкретным значением

dist3 = distl + dist2; // складываем две переменные

dist4 = distl + dist2 + dist3: // складываем несколько переменных

// показываем, что же у нас получилось

cout « "distl = ' : distl.showdist ( ): cout « endl
cout « "dist2 = ' : dist2.showdist ( ): cout « endl
cout « "dist3 = ' : dist3.showdist ( ): cout « endl
cout « "dist4 = " : dist4.showdist ( ): cout « endl

return 0:

}

Для того чтобы показать, что результат сложения может быть использован в других операциях, мы выполнили в функции main() следующие действия: сложили distl, dist2 и dist3, чтобы получить dist4 (значение которой представляет собой удвоенное значение переменной dist3), в строке:

dist4 = distl + dist2 + dist3:

Вот результат работы программы:

Введите футы: 10 Введите дюймы: 6.5

distl - 10'-6.5" - ввод пользователя

dist2 = 11'-6.25" - предопределено в программе

i^st3 - 22'-0.75" - distl+dist2

rst4 - 44'-1.5" - distl+dist2+dist3 322

Глава 8. Перегрузка операций

Объявление метода operator+() в классе Distance выглядит следующим образом: Distance operator+ ( Distance );

Эта операция возвращает значение типа Distance и принимает один аргумент типа Distance. В выражении

dist3 - distl + dist2;

важно понимать, к каким объектам будут относиться аргументы и возвращаемые значения. Когда компилятор встречает это выражение, то он просматривает типы аргументов. Обнаружив только аргументы типа Distance, он выполняет операции выражения, используя метод класса Distance operator+(). Но какой из объектов используется в качестве аргумента этой операции — distl или dist2? И не нужно ли нам использовать два аргумента, так как мы складываем два объекта?

Существует правило: объект, стоящий с левой стороны операции (в нашем случае distl), вызывает функцию оператора. Объект, стоящий справа от знака операции, должен быть передан в функцию в качестве аргумента. Операция возвращает значение, которое мы затем используем для своих нужд. В нашем случае мы присваиваем его объекту dist3. Рисунок 8.2 иллюстрирует все эти действия.

Рис. 8.2. Перегрузка бинарной операции с одним аргументом

В функции operator+() к левому операнду мы имеем прямой доступ, используя feet и inches, так как это объект, вызывающий функцию. К правому операнду мы имеем доступ как к аргументу функции, то есть как d2.feet и d2.inches.

Мы можем обобщить изложенное выше и сказать, что перегруженной операции всегда требуется количество аргументов на один меньшее, чем количество операндов, так как один из операндов является объектом, вызывающим функцию. Поэтому для унарных операций не нужны аргументы (это правило не- Перегрузка бинарных операций_323
Предыдущая << 1 .. 115 116 117 118 119 120 < 121 > 122 123 124 125 126 127 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100