Шаг 10.
Перегрузка операции ввода

    На этом шаге мы рассмотрим перегрузку операции ввода.

    Для перегрузки (расширения действия) операции ввода >> необходимо определить операцию-функцию вида:

istream& operator  >>   (istream&  in,   новый_тип& имя)
{   // Любые  операторы для параметра нового типа.
    in >>  ...   //  Ввод значений нового типа. 
    return in;   //  Возврат ссылки на объект класса istream.
}

    Здесь новый_тип - тип, определенный пользователем, т.е. некоторый класс или его частный случай - структурный тип. Основное отличие от перегрузки операции вывода - необходимость в качестве второго параметра использовать ссылку. Для уже введенного на предыдущих шагах структурного типа "точка трехмерного евклидова пространства" можно с помощью перегрузки операции ввода >> очень изящно определить последовательность ввода с консоли значений координат. Например, удобной может оказаться операция-функция, использованная в следующей программе:

//OOР10_1.СРР  -  перегрузка операции ввода >>.
#include <iostream.h>
struct point //  Точка трехмерного евклидова пространства.
{ 
  float x;
  float y;
  float z;
};
istream&  //  Тип возвращаемого  значения.
    operator >> (istream&  in,   point& d) 
{ 
  cout <<"\n Введите три координаты точки: " << "\nx = ";
  in >> d.x;
  cout << "y = "; in >> d.y;
  cout << "z = "; in >> d.z;
  return in; 
}
void main() 
{ 
  point D;
  cin >> D;
}
Текст этой программы можно взять здесь.

    При выполнении на экране может быть, например, такой текст:

    Введите три координаты точки: 
    х = 100 <Enter> 
    у = 200 <Enter> 
    z = 300 <Enter>

    В предложенной операции-функции operator >> () выполняет не только "чтение" (ввод) данных, набираемых пользователем на клавиатуре (в примере 100, 200, 300), но и выводит на экран соответствующие подсказки, что упрощает использование программы. В данной программе операция-функция operator >> () работает не только со входным потоком, ссылка на который передается как параметр, но и со стандартным выходным потоком cout, для которого обычным образом используется операция вывода <<. Поэтому до определения операции-функции operator >> () в текст программы необходимо включить заголовочный файл iostream.h.

    Следующая программа еще раз иллюстрирует сказанное. В программе определен структурный тип employee, предназначенный для структур, содержащих сведения о некоторых "служащих":

    В теле операции-функции operator >> (), распространяющей действие операции ввода >> на структуру типа employee, на экран (поток cout) выводятся подсказки и из потока типа istream считываются набираемые на клавиатуре данные.

    Текст программы:

//OOР10_2.СРР - перегрузка операций ввода >> и вывода <<.
#include <iostream.h>
// Определение класса "служащий":
struct employee  
{ 
  char name[50]; // Фамилия.
  long salery;   // Оклад.
  int age;       // Возраст.
};
// Определение операции-функции, "распространяющей" 
// действие операции ввода " на операнд типа employee: 
istream&  // Тип возвращаемого значения.
    operator >> (istream& input, employee& em) 
{ 
  cout << "\n\nВведите сведения о служащем:" <<
         "\nФамилия: ";
  input >> em.name; 
  cout << "Оклад: "; 
  input >> em.salery; 
  cout << "Возраст:  "; 
  input >> em.age; 
  return input;
}
//Прототип операции-функции для перегрузки операции <<:
ostream& operator << (ostream&, employee);
void main ()
{ 
  employee E;  // Определен объект класса employee.
  cin >> E;
  cout << E;
}
// Определение  операции-функции для перегрузки
// операции <<:
ostream&  operator << (ostream& out, employee e)
{ 
  out << "\nВведены следующие сведения о служащем:";
  out << "\nИмя:   " << e.name;
  out << ", оклад: " << e.salery <<" руб.";
  out << ", возраст: "<< e.age <<" лет.\n";
  return out;
}
Текст этой программы можно взять здесь.

    Возможный результат выполнения программы:

    Введите сведения о служащем: 
    Фамилия: Иванов <Enter> 
    Оклад: 6000 <Enter> 
    Возраст: 28 <Enter>
    Введены следующие сведения о служащем:
    Имя: Иванов, оклад: 6000 руб., возраст: 28 лет.
В программе для структуры типа employee перегружены как операция ввода >>, так и операция вывода <<.

    На следующем шаге мы рассмотрим функции для обмена с потоками.




Предыдущий шаг Содержание Следующий шаг