ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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).
Разумеется, для любых других классов можно перегружать операторы встав- ки и извлечения таким же способом.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48