- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
C++ - Страустрап Бьярн
Шрифт:
Интервал:
Закладка:
Средства ввода/вывода «stream.h» связаны исключительно с обработкой преобразования типизированных объектов в последвательности символов и обратно. Есть и другие схемы ввода/ввода, но эта является основополагающей в системе UNIX, и большая часть видов двоичного ввода/вывода обрабатывается чрез рассмотрение символа просто как набора бит, при этом его общепринятая связь с алфавитом игнорируется. Тогда для прораммиста ключевая проблема заключается в задании соответствия между типизированным объектом и принципиально нетипизированой строкой.
Обработка и встроенных и определяемых пользователем тпов однородным образом и с гарантией типа достигается с пмощью одного перегруженного имени функции для набора функций вывода. Например:
put(cerr,"x = «); // cerr – поток вывода ошибок put(cerr,x); put(cerr,»n");
Тип параметра определяет то, какая из функций put будет вызываться для каждого параметра. Это решение применялось в нескольких языках. Однако ему недостает лаконичности. Перерузка операции «„ значением «поместить в“ дает более хорошую
запись и позволяет программисту выводить ряд объектов одним оператором. Например:
cerr «„ "x = " «« x «« «n“;
где cerr – стандартный поток вывода ошибок. Поэтому, ели x является int со значением 123, то этот оператор напечтает в стандартный поток вывода ошибок
x = 123
и символ новой строки. Аналогично, если X принадлежит определенному пользователем типу complex и имеет значение (1, 2.4), то приведенный выше оператор напечатает в cerr
x = (1,2.4)
Этот метод можно применять всегда, когда для x определна операция ««, и пользователь может определять операцию «« для нового типа.
8.2 Вывод
В этом разделе сначала обсуждаются средства форматного и бесформатного вывода встроенных типов, потом приводится стадартный способ спецификации действий вывода для определяемых пользователем типов.
8.2.1 Вывод встроенных типов
Класс ostream определяется вместе с операцией «„ («пместить в“) для обработки вывода встроенных типов:
class ostream (* // ... public: ostream amp; operator««(char*); ostream amp; operator««(int i) (* return *this««long(i); *) ostream amp; operator««(long); ostream amp; operator««(double);
ostream amp; put(char); *);
Функция operator«« возвращает ссылку на ostream, для кторого она была вызвана, чтобы к ней можно было применять другой ostream. Например:
cerr «« "x = " «« x;
где x является int, будет интерпретироваться как:
(cerr.operator««("x = ")).operator««(x);
В частности, отсюда следует, что когда один оператор ввода печатает несколько элементов, они будут печататься в ожидаемом порядке: слева направо. Наличие operator««, которая получает int, является избыточным, поскольку int может неявно преобразовываться в long. С другой стороны, int может преоразовываться также и в double. Наличие ostream::operator««(int) позволяет избежать этой неоднознаности. Для печати символов в виде символов предоставляется функция ostream::put(char), а ostream::operator««(int) печтает их целые значения.
8.2.2 Вывод определяемых пользователем типов
Рассмотрим определяемый пользователем тип:
class complex (* double re, im; public: complex(double r = 0, double i = 0) (* re=r; im=i; *)
friend double real(complex amp; a) (* returna.re; *) friend double real(complex amp; a) (* returna.re; *)
friend complex operator+(complex, complex); friend complex operator-(complex, complex); friend complex operator*(complex, complex); friend complex operator/(complex, complex); // ... *);
Операцию «« для нового типа complex можно определить так:
ostream amp; operator««(ostream amp;s, complex z) (* return s «« "(" «« real(z) «« "," «« imag(z) «« ")"; *)
и использовать точно так же, как для встроенного типа:
complex x(1,2); // ... cout «„ "x = " «« x «« «n“;
получая при этом
x = (1,2)
Определение действия вывода для определяемого пользовтелем типа не требует ни модификации описания класса ostream, ни доступа к структуре данных (скрытой), которую этот класс поддерживает. Очень удачно, что имеет место первое, потому что описание класса ostream находится в стандартных заголвочных файлах, к которым у обычного пользователя нет доступа на запись. Последнее также важно, потому что обеспечивает зщиту от случайной порчи структуры данных. Это также позволяет менять реализацию ostream не влияя на пользовательские прораммы.
8.2.3 Некоторые подробности разработки
Операция вывода используется, чтобы избежать той многоловности, которую дало бы использование функции вывода. Но почему ««?
Возможности изобрести новый лексический символ нет (#6.2). Операция присваивания была кандидатом одновременно и на ввод, и на вывод, но оказывается, большинство людей препочитают, чтобы операция ввода отличалась от операции вывода. Кроме того, = не в ту сторону связывается (ассоциируется), то есть cout=a=b означает cout=(a=b).
Делались попытки использовать операции « и », но значния «меньше» и «больше» настолько прочно вросли в сознание людей, что новые операции ввода/вывода во всех реальных слчаях оказались нечитаемыми. Помимо этого, "«" находится на большинстве клавиатур как раз на ",", и у людей получаются операторы вроде такого:
cout « x , y , z;
Для таких операторов непросто выдавать хорошие сообщения об ошибках.
Операции «„ и “» к такого рода проблемам не приводят, они асимметричны в том смысле, что их можно проассоциировать с "в" и «из», а приоритет «« достаточно низок, чтобы можно было не использовать скобки для арифметических выражений в роли операндов. Например:
cout «„ „a*b+c=“ «« a*b+c «« «n“;
Естественно, при написании выражений, которые содержат операции с более низкими приоритетами, скобки использовать надо. Например:
cout «„ „a^b!c=“ «« (a^b!c) «« «n“;
Операцию левого сдвига тоже можно применять в операторе вывода:
cout «„ „a««b=“ «« (a««b) «« «n“;
В С++ нет выражений с символьными значениями, в частноти, 'n' является целым (со значением 10, если используется набор символов ASCII), поэтому
cout «« "x = " «« x «« 'n';
напечатает число 10, а не ожидаемый символ новой строки. Эту и аналогичные проблемы можно сгладить, определив несколко макросов (в которых используются стандартные имена симвлов ASСII):
#define sp «„ " " #define ht „« «t“ #define nl «« «n“
Теперь предыдущий пример запишется в виде:
cout «« "x = " «« x nl;
Для печати символов предоставляются функции ostream::put (char) и chr(int) (см. #8.2.4). Хотя в некоторых кругах нсинтаксические макросы считаются худшим видом макросов, мне они нравятся.
Рассмотрим примеры:
cout «„ x „« " " «« y «« " " «« z «« «n“; cout «« "x = " «« x «« ", y = " «« y «« «n“;
Люди находят их трудно читаемыми из-за большого числа кавычек и того, что операция вывода внешне выглядит слишком непривычно. Здесь могут помочь приведенные выше макросы и несколько отступов:
cout «« x sp «« y sp «« z nl; cout «« "x = " «« x «« ", y = " «« y nl;
8.2.4 Форматированный вывод
Пока «« применялась только для неформатированного вывда, и на самом деле в реальных программах она именно для этго главным образом и применяется. Помимо этого существует также несколько форматирующих функций, создающих представление своего параметра в виде строки, которая используется для вывода. Их второй (необязательный) параметр указывает, сколко символьных позиций должно использоваться.
char* oct(long, int=0); // восьмеричное представление char* dec(long, int=0); // десятичное представление char* hex(long, int=0); // шестнадцатиричное представление char* chr(int, int=0); // символ char* str(char*, int=0); // строка

