Программирование >>  Программирование на языке c++ 

1 ... 102 103 104 [ 105 ] 106 107 108 ... 159


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



1 ... 102 103 104 [ 105 ] 106 107 108 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.069
При копировании материалов приветствуются ссылки.
Яндекс.Метрика