На этом шаге мы рассмотрим перегрузку операции ввода.
Для перегрузки (расширения действия) операции ввода >> необходимо определить операцию-функцию вида:
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 лет.
На следующем шаге мы рассмотрим функции для обмена с потоками.