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

 

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

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

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


Введите 'да' или 'нет': да Вы ввели 'да'

Функция operator==() использует библиотечную функцию strcmpO Для сравнения двух строк. Эта функция возвращает 0, если строки равны, отрицательное число, если первая строка меньше второй, и положительное число, если первая строка больше второй строки. Здесь «меньше чем» и «больше чем» использованы в их лексикографическом смысле для определения того, что стоит раньше в алфавитном списке — первая строка или вторая.

Другие операции сравнения, такие, как < и >, могут быть также использованы для сравнения лексикографического значения строк. Или, что то же самое, операторы сравнения могут быть переопределены для сравнения длины строк. Так как вы можете сами определять, для чего будет использоваться операция, то вы можете использовать любое подходящее для вашей ситуации определение.

Операции арифметического присваивания

Давайте закончим наше изучение перегрузки бинарных операций на примере арифметического присваивания: +=. Вспомним, что эта операция выполняет присваивание и сложение за один шаг. Мы будем использовать эту операцию для сложения интервалов, записывая результат в переменную, обозначающую первый интервал. Это похоже на пример ENGLPLUS, представленный нами ранее, но здесь есть небольшое отличие. Приведем листинг программы ENGLPLEQ.

// engpleq.cpp // перегрузка операции += #include <iostream> Перегрузка бинарных операций 329

using namespace std; ///////////////////////////////////////////////////////////

class Distance // класс английских мер длины

{

private: int feet: float inches: public:

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

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

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

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

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

void getdist ( ) {

cout « ЛпВведите футы: "; сіп » feet; cout « "Введите дюймы: "; сіп » inches;

}

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

{ cout « feet « "V-" « inches « '': } // сложение с присвоением bool operator+= ( Distance ) const:

}:

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

void Distance::operator+= ( Distance d2 )

{

feet += d2.feet: // складываем футы inches += d2.inches: // складываем дюймы

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

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

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

нштттшшшштншшттнншштш

int main ( ) {

Distance distl: // определяем переменную

distl.getdist ( ): //и вводим информацию

cout « "\ndTstl = "; distl.showdist ( );

Distance dist2 ( 11. 6.25 ): // описываем и инициализируем другую переменную

cout « "\ndist2 = ": dist2.showdist ( ):

distl += dist2: // distl = distl + dist2

cout « "\пПосле добавления:";

cout « "\ndistl = ": distl.showdist ( ); cout « endl:

return 0;

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

В этой программе мы прлучаем интервал от пользователя и складываем его со вторым интервалом, инициализированным в программе как 1Г-6.25". Пример простого взаимодействия с программой:

Введите футы: 3 Введите дюймы: 5.75 distl = 3'-5.75" dist2 - 11'-6.25" После добавления: distl = 15'-О"

В этой программе сложение выполняется в функции main() в строке

distl += dist2:

Это означает, что сумма интервалов distl и dist2 будет записана в переменную distl.

Заметим, что существует различие между функцией operator+=(), используемой здесь, и функцией operator+() из программы ENGLPLUS. В функции operator+() создается новый объект типа Distance, который будет затем возвращен функцией, чтобы быть присвоенным третьему объекту типа Distance:

dist3 = distl + dist2;

В функции operator+=() программы ENGLPLEQ объектом, принимающим значение суммы, является объект, вызывающий функцию operator+=(). Поэтому feet и inches являются заданными величинами, а не временными переменными, используемыми только для возвращаемого объекта. Функция operator+«() не имеет возвращаемого значения: она возвращает тип void. Для операции += возвращаемое значение не требуется, так как мы не присваиваем ее результат никакой переменной. Эта операция используется без возвращаемого значения в выражениях, похожих на выражение из нашей программы: distl += dist2:

Но если мы захотим использовать эту операцию в более сложных выражениях, таких, как:

dist3 - distl +- dist2:

то в этом случае нам понадобится возвращаемое значение. Мы можем ввести его, записав в конце определения функции operator+»() строку return Distance ( feet, inches ):

в которой безымянный объект инициализируется тем же значением, что и объект, вызывающий функцию, и затем возвращается.

Операция индексации массива ([])

Операция индексации, которая обычно используется для доступа к элементам массива, может быть перегружена. Это полезно в том случае, если вы хотите изменить способ работы С++ с массивами. Например, если вам понадобится создать «безопасный массив», в котором заложена автоматическая проверка ис- Перегрузка бинарных операций 331
Предыдущая << 1 .. 118 119 120 121 122 123 < 124 > 125 126 127 128 129 130 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100