Программирование >>  Операторы преобразования типа 

1 ... 177 178 179 [ 180 ] 181 182 183 ... 239


функция Описание

frexpO Преобразование вещественного числа в целую и дробную части

IdexpO Умножение вещественного числа на целую степень 2

modf() Извлечение знаковой целой и дробной частей из вещественного числа

Таблица 12.9. Функции, определяемые в заголовочном файле <cstdlib>

Функция Описание

abs() Модуль (абсолютное значение) для типа int

labs{) Модуль (абсолютное значение) для типа long

div() Частное и остаток от деления для типа int

ldiv() Частное и остаток от деления для типа long

srandO Инициализация генератора случайных чисел

rand() Получение следующего случайного числа

В языке С++, в отличие от С, операции могут перегружаться для разных типов, из-за чего некоторые числовые функции С становятся лишними. Например, в С определены функции abs(), labs() и fabs() для вычисления модуля типов int, long и double соответственно. В С++ функция abs() перегружается для различных типов данных, что позволяет использовать ее со всеми типами.

В частности, все математические функции перегружены для вещественных типов float, double и long double. Однако при этом возникает важный побочный эффект: при передаче целого значения выражение становится неоднозначным:

std::sqrt(7) НЕОДНОЗНАЧНОСТЬ: sqrt(float). sqrt(double)

или sqrtdong double)?

Вместо этого приходится использовать такую запись: std:;sqrt(7.0) ОК

А при использовании переменной нужно писать так: 1nt х:

std:;sort(float(x)) ОК

Разработчики библиотек решают эту проблему по-разному; одни не включают перегруженные версии, другие следуют стандарту (перегрузка для всех вещественных типов), третьи предлагают перегрузку для всех числовых типов, а некоторые позволяют выбрать нужный вариант на уровне препроцессора. Это означает, что на практике нельзя быть уверенным как в наличии неоднозначности, так и в ее отсутствии. Чтобы обеспечить переносимость кода, всегда следите за точным соответствием типов аргументов.

Спасибо Дэвиду Вандеворду (David Vandevoorde) за это пояснение.




Ввод-вывод

с использованием

потоковых классов

Классы ввода-вывода являются важнейшими классами стандартной библиотеки С++, - программа, которая не вводит и не выводит данные, вряд ли принесет много пользы. Более того, классы ввода-вывода стандартной библиотеки С++ не ограничиваются операциями с файлами, экраном и клавиатурой. Они создают расширяемую архитектуру для форматирования произвольных данных и работы с произвольными внешними представлениями .

Библиотека lOStream (как называется совокупность классов ввода-вывода) - единственная часть стандартной библиотеки С++, которая пшроко использовалась до стандартизации С++. В ранние поставки систем С++ включались классы, разработанные в AT&T и ставшие фактическим стандартом ввода-вывода. Хотя в дальнейшем эти классы адаптировались для интеграции со стандартной библиотекой С++ н выполнения некоторых новых функций, базовые принципы, заложенные в классы библиотеки lOStream, остались неизменными.

Эта глава начинается с общего обзора важнейших компонентов и принципов потокового ввода-вывода, после чего подробно рассматриваются возможности практического применения библиотеки lOStream - от простого форматирования до интеграции с новыми внешними представлениями (тема, которая часто понимается неправильно).

Чтобы подробно рассмотреть все аспекты, относящиеся к библиотеке lOStream, понадобилась бы отдельная книга. За дополнительной информацией обращайтесь к книгам, посвященным потоковому вводу-выводу, или справочникам по стандартной библиотеке С++.

Большое спасибо Дитмару Кюлю (Dietmar КйЫ), эксперту по вопросам ввода-вывода и интернационализации в стандартной библиотеке С++, который помогал мне в работе над этой главой и написал часть материала.

Для читателей, знакомых со старой библиотекой lOStream, перечислим изменения, внесенные в процессе стандартизации. Хотя основные принципы потоковых классов ввода-вывода остались неизменными, были добавлены некоторые важные новшества, расширяюпше возможности настройки и адаптации.

О Была проделана работа по интернационализации ввода-вывода.

О Потоковые классы для символьных массивов типа char* были заменены классами, использующими строковые типы стандартной библиотеки С++. Старые



классы по-прежнему поддерживаются для обеспечения совместимости, но они считаются устаревшими

О Обработка ошибок была интегрирована с обработкой исключений.

О Библиотечные классы lOStream с поддержкой присваивания (имена таких классов заканчиваются суффиксом withassign) были заменены новыми средствами, доступными для всех потоковых классов.

О Классы библиотеки lOStream преобразованы в шаблоны, что позволяет поддерживать разные представления символов. Однако в результате возникает побочный эффект - нельзя использовать простые опережающие объявления потоковых классов:

class ostream: Ошибка

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

include <iosfwd> OK

О Все символические имена библиотеки lOStream, как и в остальных компонентах стандартной библиотеки С++, объявляются в пространстве имен std.

Общие сведения о потоках ввода-вывода

Прежде чем переходить к подробному описанию потоковых классов, мы кратко рассмотрим общеизвестные аспекты работы с потоками данных - это заложит основу для дальнейшего изложения материала. Читатели, хорошо знакомые с потоковым вводом-выводом, могут пропустить этот раздел.

Потоковые объекты

В С++ операции ввода-вывода выполняются при помощи потоков данных. Согласно принципам объектно-ориентированного программирования, поток данных представляет собой объект, свойства которого определяются классом. Вывод интерпретируется как запись данных в поток, а ввод - как чтение данных из потока. Для стандартных каналов ввода-вывода существуют стандартные глобальные объекты.

Потоковые классы

Специализированные разновидности ввода-вывода (ввод, вывод, операции с файлами) представлены в библиотеке разными классами. Среди потоковых классов центральное место занимают следующие:

О класс istream - входной поток, используемый для чтения данных; О класс ostream - выходной поток, используемый для записи данных.

Термин устаренший: (deprecated) означает, что использовать то или иное средство не рекомендуется, поскольку сущестнует новая, более совершенная замена. Кроме того, устаревшие средства с большой вероятностью будут исключены из будущих версий стандарта.



1 ... 177 178 179 [ 180 ] 181 182 183 ... 239

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