|
Программирование >> Операторы преобразования типа
функция Описание 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) означает, что использовать то или иное средство не рекомендуется, поскольку сущестнует новая, более совершенная замена. Кроме того, устаревшие средства с большой вероятностью будут исключены из будущих версий стандарта.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |