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

 

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

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

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


Напомним, что при использовании enum для установки константы значение SZ временно фиксировано. Так как все компиляторы работают по стандартам С++, то вы можете изменить значение SZ

static const int SZ = 80:

Множественная перегрузка

Мы рассмотрели различные примеры использования операции +: для сложения интервалов и объединения строк. Мы можем использовать оба написанных нами класса в одной программе, и при этом компилятор будет знать, какая из функций нам нужна, так как он выбирает функцию, исходя из операндов операции.

Операции сравнения

Давайте рассмотрим перегрузку операций другого типа: операций сравнения.

Сравнение объектов класса Distance

В нашем первом примере мы перегрузим операцию «меньше чем» (<) в классе Distance для того, чтобы иметь возможность сравнивать объекты этого класса. Приведем листинг программы ENGLESS.

// engl ess.срр

// перегрузка операции < для сравнения длин Iincude <iostream> using namespace std: //////////////////////¦/////////////////////////////////////

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

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

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:

}

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

{ cout « feet « "V-" « inches « 'V" : } Il сравнение двух длин bool operator« ( Distance ) const:

}:

іпішіптіїтіїшіпшшітттппшіїїііііш

II сравнение двух длин

bool Distance::operator< ( Distance d2 ) const {

float bfl = feet + inches / 12: float bf2 - d2.feet + d2.inches / 12; return ( bfl < bf2 ) ? true : false:

}

lllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

int main ( ) {

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

distl.getdist ( ); H получаем длину от пользователя

Distance d1st2 ( 6, 2.5 ): П определяем и инициализируем переменную

// показываем длины

cout « "\ndtstl - ": distl.showdist ( ): cout « "\ndist2 - ": dist2.showdist ( ):

Il используем наш оператор if ( distl < dist2 )

cout « "\ndistl меньше чем dist2": else

cout « "\ndistl больше или равно чем dist2": cout « endl:

return 0:

}

Эта программа сравнивает интервал, заданный пользователем, с интервалом 6'-2.5", определенным в программе. В зависимости от полученного результата затем выводится одно из двух предложений. Пример возможного вывода:

Введите футы: 5 Введите дюймы: 11.5 Перегрузка бинарных операций 327

distl - 5'-11.5" d1st2 - 6'-2.5" distl меньше чем dist2

Подход, используемый для функции operator<() в программе ENGLESS, похож на перегрузку операции + в программе ENGPLUS, за исключением того, что здесь функция operator<() имеет возвращаемое значение типа bool. Возвращаемым значением может быть false или true, в зависимости от результата сравнения двух интервалов. При сравнении мы конвертируем оба интервала в значения футов с плавающей точкой и затем сравниваем их, используя обычную операцию <. Помним, что здесь использована операция условия:

return ( bfl < bf2 ) ? true : false: это то же самое, что

if ( bfl < bf2 )

return true; else return false:

Сравнение строк

Рассмотрим другой пример перегрузки оператора, теперь это будет оператор сравнения (==). Мы будем использовать его для сравнения объектов класса String, возвращая true, если они одинаковы, и false, если они различны. Листинг программы STREQUAL:

// strequal.срр // перегрузка операции — finclude <iostream> using namespace std:

#include «string.h> // для функции strcmp ІІІІІІІІІІІІІІІІітіШІШІІІІІІІШІІІШІШІІІІІІІІІІІ

class String // наш класс для строк

{

private:

enum { SZ = 80: } // максимальный размер строки char str [ SZ ]; // массив для строки public:

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

{ strcpy ( str. "" ): } // конструктор с одним параметром String ( char s [ ] )

{ strcpy ( str. s ): } // показ строки void display ( ) const

{ cout « str; } // получение строки void getdist ( )

{ сі п.get ( str. SZ ): } // оператор сравнения

bool operator== ( String ss ) const {

return ( strcmp ( str, ss.str ) —0 ) ? true : false:

}

}: 328

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

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

int main ( ) {

String si = "да": String s2 = "нет": String s3;

cout « "\пВведите 'да' или 'нет': ":

s3.getstr (): // получаем строку от пользователя

if ( s3 == si ) // сравниваем со строкой 'да'

cout « "Вы ввели 'да'\п": else

if ( s3 — s2 ) // сравниваем со строкой 'нет'

cout « "Вы ввели 'нет'\n": else

cout « "Следуйте инструкциям!Nn": return 0:

}

В функции main() мы используем операцию == дважды: в первый раз, когда определяем, введена ли строка «да», а во второй раз — введена ли строка «нет». Вот результат работы программы, когда пользователь печатает слово «да»:
Предыдущая << 1 .. 117 118 119 120 121 122 < 123 > 124 125 126 127 128 129 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100