Инструменты пользователя

Инструменты сайта


examination:oop:question22

22. Программирование ввода-вывода. Потоки. Ввод-вывод значений встроенных типов. Ввод-вывод для пользовательских типов.

Широко известна трудность задачи проектирования и реализации стандартных средств ввода-вывода для языков программирования. Традиционно средства ввода-вывода были рассчитаны исключительно на небольшое число встроенных типов данных.

Строгую типовую и единообразную работу как со встроенными, так и с пользовательскими типами можно обеспечить, если использовать единственное перегруженное имя функции для различных операций вывода. Тип аргумента определяет какую функцию надо вызывать в каждом случае.

СТАНДАРТНЫЕ ПОТОКИ ВЫВОДА

Для управления выводом встроенных типов определяется класс ostream с операцией « (вывести):

    cout << "x = " << x << '\n';

Здесь cout обозначает стандартный поток вывода. Так, если х типа int, то значением 123, то приведенный оператор выдаст

  x = 123
class ostream : public virtual ios {
     // ...
public:
    ostream& operator<<(const char*);    //строки
    ostream& operator<<(char);
     // ...
};

РАБОТА СО СТАНДАРТНЫМИ ПОТОКАМИ ВВОДА

Ввод встроенных типов осуществляется посредством потокового класса istream.

class istream : public virtual ios {
     //...
public:
     istream& operator>>(char*);     // строка
     //...
};

У этого класса имеется множество переопределенных операторов operator», под каждый встроенный тип.

    int x = 0;
    cin >> x;

ВЫВОД ПОЛЬЗОВАТЕЛЬСКИХ ТИПОВ

Вывод пользовательских типов осуществляется посредством переопределения оператора сдвига у классов, например для класса комплексных чисел это может выглядеть так

    ostream& operator<<(ostream&s, complex z)
    {
         return s << '(' real(z) << ',' << imag(z) << ')';
    };

А использовать можно так:

    complex x(1,2);
    cout << "x = " << x << '\n';

Здесь вызывается переопределенный оператор сдвига, который принимает в качестве параметра поток.

ВВОД ПОЛЬЗОВАТЕЛЬСКИХ ТИПОВ

Операцию ввода для пользовательского типа можно определить в точности так же, как и операцию вывода, но для операции ввода существенно, чтобы второй параметр имел тип ссылки, например:

    istream& operator>>(istream& s, complex& a){
    }

Этот оператор в соответствии с символами на входном потоке нужным образом изменит объект.

complex x(0,0); cin » x;

examination/oop/question22.txt · Последние изменения: 2014/01/15 08:22 (внешнее изменение)