|
Программирование >> Операторы преобразования типа
typedef basic istream<char> iostream: typedef bas1c 1stream<wchar t> wiostream: В западном полушарии обычно исиользуются типы istream и ostream, в целом совместимые со старыми потоковыми классами AT&T. Классы istream withassign, ostream withassign и iostream withassign, включенные в некоторые старые потоковые библиотеки (и производные от istream, ostream и iostream соответственно), не поддерживаются стандартом. Их функциональность реализуется другими средствами (см. с. 615). Также в библиотеку lOStream входят дополнительные классы для выполнения форматированного ввода-вывода при работе с файлами и строками. Эти классы рассматриваются на с. 602 и 619. Глобальные потоковые объекты Для потоковых классов определен ряд глобальных потоковых объектов, предназначенных для работы со стандартными каналами ввода-вывода (табл. 13.2). Эти объекты упоминались выше при описании потоков данных с типом символов char, однако аналогичные объекты также определены для потоков данных с типом символов wchar t. Таблица 13.2. Глобальные потоковые объекты
По умолчанию эти стандартные потоки данных синхронизируются со стандартными потоками данных С. Иначе говоря, стандартная библиотека С++ гарантирует сохранение порядка вывода при смешанном использовании потоков данных С и С++. Перед выводом все буферы стандартных потоков данных С++ очищают буферы соответствующих потоков данных С, и наоборот. Разумеется, синхронизация требует дополнительного времени. Если она не нужна, отключите ее вызовом sync with stdio(false) перед первой операцией ввода-вывода (см. с. 654). тандартные операторы << и >> В С и С++ операторы << и >> используются для сдвига битов целых чисел вправо и влево. Классы basicjstream и basic ostream перегружают операторы >> и << для выполнения стандартных операций ввода-вывода. На первый взгляд кажется, что объявлять классы с поддержкой ввода и вывода в заголовке <istreain> нелогично. Но так как в начале работы каждой единицы трансляции, включающей <iostream>, тратится время на инициализацию, объявления для ввода и вывода были выделены в файл <istream>. (аголовочные файлы Определения потоковых классов распределены по нескольким заголовочным файлам. О <iosfwd>. Содержит опережающие объявления потоковых классов. Этот заголовочный файл необходим из-за того, что простые опережающие объявления вида class ostream теперь не разрешены. О <streambuf>. Содержит определения базового потокового класса с буферизацией (basic streambuf<>). О <istream>. Содержит определения классов, поддерживающих только ввод (ba5ic istreamo), а также классов с поддержкой ввода и вывода (basicjostreamo) О <ostream>. Содержит определения потокового luiacca вьшода (basic ostream<>). О <iostream>. Содержит объявления глобальных потоковых объектов (таких, как cin и cout). Многие из этих заголовочных файлов предназначены для внутренней организации стандартной библиотеки С++. Прикладному программисту обычно достаточно включить файл <iosfwd> в объявление потоковых классов и <istream> или <ostream> при непосредственном использовании функций ввода или вывода. Заголовок <iostream> следует включать только при использовании стандартных потоковых объектов. В некоторых реализациях в начале работы каждой единицы трансляции, включающей этот заголовок, вьшолняется фрагмент кода инициализации. Само по себе выполнение этого кода обходится недорого, но при этом приходится загружать соответствующие страницы исполняемого файла, а эта операция может быть довольно дорогостоящей. Как правило, в программу следует включать только заголовки, содержащие абсолютно необходимые объявления. В частности, в заголовочные файлы должен включаться только заголовок <iosfwd>, а соответствующие файлы реализации включают заголовок с полным определением. Специальные средства работы с потоками данных (параметризованные манипуляторы, файловые и строковые потоки данных) определяются в дополни тельных заголовочных файлах (<iomanip>, <fstream>, <sstream> и <str5tream>). Дополнительная информация об этих заголовках приводится в разделах, посвященных этим специальным средствам. Оператор вывода << Класс basic ostream (а следовательно, и классы ostream и wstream) интерпретирует << как оператор вывода. Он перегружает этот оператор для всех базовых типов, включая char*, void и bool. В соответствии с определением операторов потокового вывода второй аргумент передается в соответствующий поток данных. Иначе говоря, данные пересылаются в направлении стрелки : int 1 = 7; Std: icout 1: Вывод: 7 float f = 4.5: std::cout f; Вывод: 4.5 Оператор << перегружается так, что второй аргумент может относиться к произвольному тину данных. Это позволяет интегрировать ваши типы данных с системой ввода-вывода. Компилятор следит за тем, чтобы для вывода второго аргумента была вызвана правильная функция. Конечно, эта функция должна преобразовать второй аргумент в последовательность символов, выводимых в поток данных. В стандартной библиотеке С++ этот механизм также применяется при выводе строк (см. с. 506), битовых полей (см. с. 452) и комплексных чисел (см. с. 518): std: :strlng sChello ): s +- . world ; std::cout s: Вывод: hello, world std::b1tset<lO> flegs(7): std::cout flags; Вывод: 0000000111 std::complex<float> c(3.1.7.4); Std:;COut c; Вывод: (3.1.7.4) Принципы определения операторов вывода для пользовательских типов данных рассматриваются на с. 625. Возможность расширения механизма вывода для поддержки пользовательских типов данных является сушественным усовершенствованием по сравнению с механизмом ввода-вьшода языка С, основанным па использовании функции printf(), поскольку больше не требуется указание типа выводимого объекта. Перегрузка оператора для различных типов гарантирует, что правильная функция вывода будет выбрана автоматически. Оператор << не ограничивается стандартными типами. Таким образом, в распоряжении программиста появляется единый механизм вывода, работающий со всеми типами. Оператор << также может использоваться для вывода нескольких объектов в одной команде. По общепринятым правилам операторы вывода возвращают свой первый аргумент, то есть результатом выполнения оператора вывода явля-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |