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

Перегрузка cout и cin

Приведем пример, в котором операторы извлечения и вставки для класса Distance перегружены для работы с cout и cin.

Листинг 12.18. Программа ENGLIO

// englio.cpp

// Перегружаемые операции << и >>

#include <iostream>

using namespace std;

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

class Distance                      // класс английских расстояний

  {

  private:

    int feet;

    float inches;

  public:

    Distance() :feet(0),inches(0.0) // конструктор (0 арг.)

      {  }

                                    // конструктор (2 аргумента)

    Distance(int ft, float in) : feet(ft), inches(in)

      {  }

Листинг 12.18 (продолжение)

    friend istream& operator >> (istream& s, Distance& d);

    friend ostream& operator << (ostream& s, Distance& d);

  };

//---------------------------------------------------------

istream& operator >> (istream& s, Distance& d) //получить

                               // значение от пользователя

  {

  cout << "\nВведите футы: ";  s >> d.feet;  // используется

  cout << "Введите дюймы: ";  s >> d.inches; // перегруженный

  return s;                                  // оператор >>

  }

//---------------------------------------------------------

ostream& operator << (ostream& s, Distance& d)       // вывести

  {                                         // расстояние

  s << d.feet << "\'-" << d.inches << '\"'; // используется

  return s;                                 // перегруженный <<

  }

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

int main()

{

  Distance dist1, dist2;     //Определение переменных

  Distance dist3(11, 6.25);  // определение, инициализация dist3

  cout << "\nВведите два значения расстояний:";

  cin >> dist1 >> dist2;     // Получить значения от пользователя

                             // вывод расстояний

  cout << "\ndist1 = " << dist1 << "\ndist2 = " << dist2;

  cout << "\ndist3 = " << dist3 << endl;

  return 0;

}

 

Программа запрашивает у пользователя два значения расстояний (типа Distance), выводит их, а также выводит значения, которые были инициализиро- ваны в программе.

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

Введите футы:12 Введите дюймы:6 dist1 = 10'-3.5"

dist2 = 12'-6"

dist3 = 11'-6.25"

Обратите внимание, как удобно и естественно можно работать с объектами типа Distance, — совершенно так же, как с объектами любого другого типа:

cin >> dist1 >> dist2;

Или, например, cout << "\ndist1 = " << dist1 << "\ndist2 = " << dist2;

Операторы извлечения и вставки перегружаются одинаковыми способами. Они возвращают по ссылке объект istream (для >>) или ostream (для <<). Возвра- щаемые значения могут организовываться в цепочки. Операторы имеют по два аргумента, оба передаются по ссылке. Первый аргумент >> — объект класса istream (например, cin). Соответственно, для << первым аргументом должен быть

объект класса ostream (например, cout). Второй аргумент — объект класса, для которого осуществляется ввод/вывод (в данном примере это класс Distance). Оператор >> берет входные данные из потока, указанного в первом аргументе, и переносит их в компонентные данные объекта, указанного во втором. По анало- гии оператор << берет данные из объекта, указанного во втором аргументе, и по- сылает их в поток, соответствующий значению первого аргумента.

Функции operator<< () и operator>> () должны быть дружественными по отно- шению к классу Distance, так как объекты istream и ostream находятся слева от знака операции (см. обсуждение дружественных функций в главе 11).

Разумеется, для любых других классов можно перегружать операторы встав- ки и извлечения таким же способом.

 

41