ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 8) онлайн

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

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

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

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

// engless.cpp

// перегрузка операции < для сравнения длин

#include <iostream>

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 << "\nВведите футы: "; cin >> feet;

        cout << "Введите дюймы: ";  cin >> inches;

      }

    // показ информации

    void showdist ( )

      { cout << feet << "\'-" << inches << '\"'; }

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

    bool operator< ( Distance ) const;

};

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

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

bool Distance::operator< ( Distance d2 ) const

{

  float bf1 = feet + inches / 12;

  float bf2 = d2.feet + d2.inches / 12;

  return ( bf1 < bf2 ) ? true : false;

}

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

int main ( )

{

  Distance dist1;            // определяем переменную

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

 

  Distance dist2 ( 6, 2.5 ); // определяем и инициализируем переменную

 

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

  cout << "\ndist1 = "; dist1.showdist ( );

  cout << "\ndist2 = "; dist2.showdist ( );

 

  // используем наш оператор

  if ( dist1 < dist2 )

    cout << "\ndist1 меньше чем dist2";

  else

    cout << "\ndist1 больше или равно чем dist2";

  cout << endl;

 

  return 0;

}

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

Введите футы: 5 Введите дюймы: 11.5

dist1 = 5'-11.5" dist2 = 6'-2.5" dist1 меньше чем dist2

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

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

if ( bf1 < bf2 )

  return true; else   return false;

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

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

// strequal.cpp

// перегрузка операции ==

#include <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 ( )

      { cin.get ( str, SZ ); }

    // оператор сравнения

    bool operator== ( String ss ) const

      {

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

      }

};

 

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

int main ( )

{

  String s1 = "да";

  String s2 = "нет";

  String s3;

 

  cout << "\nВведите 'да' или 'нет': ";

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

 

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

    cout << "Вы ввели 'да'\n";

  else

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

    cout << "Вы ввели 'нет'\n";

  else

    cout << "Следуйте инструкциям!\n";

 

  return 0;

}

 

В функции main() мы используем операцию == дважды: в первый раз, когда определяем, введена ли строка «да», а во второй раз — введена ли строка «нет». Вот результат работы программы, когда пользователь печатает слово «да»:

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

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

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

 

13