|
Программирование >> Программирование на языке c++
описание переопределенной функции operator istream& operator (istream& stream,student& s) { cout Enter name: ; stream >> s.name; ввод имени cout << \tEnter age: ; stream s.age; ввод возраста cout \tEnter average: ; return stream >> s.average evaluation; ввод средней оценки void main(void) { student st[nm]; for (int i=0;i<nm;i++) cin >> st[i]; ввод данных в объект st[i] for (i=0;i<nm;i++) st[i].get info(); вывод данных из объекта st[i] Функции operator и operator обычно задаются при переопределении со спецификатором friend. Это позволяет использовать эти операторы в привычной для языка С-и- форме. Рассмотрим объявление функции friend istream& operator (istream&,student&); Здесь функция operator имеет два аргумента, которыми являются ссылка на объект класса istream и ссылка на объект класса student (последнее позволяет ввести значения в компоненты-данные объекта типа student). Функция operator возвращает ссылку на объект класса istream, что далее позволяет выполнять операции слева направо в выражениях типа cin а b ... . Вторая программа демонстрирует переопределение обеих функций: operator и operator . #include <iostream.h> #define nm 2 class student { char name[100]; unsigned age; float average evaluation; public: StudentO : age(0),average evaluation(0) { name[0]=NULL; } friend istream& operator>>{istream&,student&); оператор ввода friend ostream& operator (ostream&,student); оператор вывода istream& operator>>{istream& stream,student& s) { cout Enter name: ; stream >> s.name; cout \tEnter age: ; stream >> s.age; cout \tEnter average: ; return stream >> s.average evaluation; ostream& operator (ostream& stream.student s) { stream name: s.name endl age: << s.age << endl << average: << s.average evaluation endl; return stream; void main{void) { student st[nm]; for (int i=0;i<nm;i++) cin >> st[i]; ввод данных в объект st[i] for (i=0;i<nm;i++) cout st[i]; вывод данных из объекта st[i] Здесь обе функции operator заданы со спецификатором friend. Рассмотрим объявление friend ostream& operator (ostream&,student); Здесь второй аргумент не обязательно должен быть ссылкой, поскольку отсутствует необходимость получения данных в объект типа student из тела функции (см. прил. 2.2). Принципы работы обеих программ должны быть ясны из пояснений, приведенных выше. 8.4. Состояния потока Каждый поток (istream или ostream) имеет связанное с ним состояние. Это состояние можно устанавливать или проверять. Оба класса, istream и ostream, являются производными класса ios (см. рис. 8.2). Класс ios имеет несколько функций (с атрибутом public), которые позволяют проверять состояние потока. Эти функции объявлены в классе ios в следующем виде: int bad() const; ошибка в потоке int eof() const; достигнут конец файла int fail() const; следующая операция будет ошибочной int good() const; следующая операция может быть успешной Действительные состояния потока представлены в классе ios в виде перечисления enum: public: enum io state { goodbit, нет ошибки eofbit, достигнут конец файла failbit, следующая операция будет ошибочной badbit, ошибка в потоке hardfail }; ошибка не исправлена Заметим, что в конкретной системе программирования элементам перечисления могут ставиться в соответствие разные целые значения, поэтому следует обращаться к этим элементам только по именам. Так, например, в системе программирования Borland С-и- эти значения следующие[7]: goodbit = О, eofbit = 1, failbit = 2, badbit = 4, hardfail = 8. Если попытаться выполнить операцию ввода из потока, который находится не в состоянии good(), то возвращается значение NULL (это будет показано ниже на примере). Если осуществляется чтение значения в переменную и происходит ошибка, то значение рассматриваемой переменной не изменяется (предполагается, что переменная имеет стандартный тип,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.069
При копировании материалов приветствуются ссылки. |