![]() |
|
Программирование >> Операторы преобразования типа
Оператор void*() обеспечивает короткую и наглядную запись проверки состояния потока данных в управляющих структурах: Пока стандартный поток ввода находится в нормальном состоянии... while (std::с1п) { Проверка логических условий в управляющих структурах не требует прямого преобразования к bool. Достаточно уникального преобразования к целому типу (например, int или char) или к тину указателя. Для чтения объекта и проверки результата в одной команде часто требуется преобразование к void*: if (std: :Cln X) { Чтение X выполнено успешно Как было показано ранее, следующее выражение возвращает cin: std::cin х Следовательно, после чтения х команда эквивалентна такой команде: if (std::c1n) { Объект cin часто используется при проверке условий; оператор void* этого объекта возвращает признак наличия ошибки потока данных. Этот прием обычно применяется в циклах, выполняющих чтение и обработку объектов: Пока удается прочитать obj while (std::cin obj) { Обработка obj (в данном случае - npocToti вывод) std::cout obj std::endl: В этом фрагменте легко угадывается классический синтаксис фильтров С, примененный к объектам С++. Цикл завершается при установке флага failbit или badbit Эти флаги устанавливаются при возникновении ошибки или достижении конца файла (попытка чтения за концом файла приводит к установке флага eofbit или badbit, как показано на с. 572). По умолчанию оператор >> игнорирует начальные пропуски. Обычно это вполне устраивает программиста, но если obj относится к типу char, то пропуски могут оказаться существенными. В этом случае в реализации фильтра можно использовать функции get() и put() потоковых классов (см. с. 582), а еще лучше - итератор istreambufjterator (см. с. 640). Оператор I проверяет обратное условие. В соответствии со своим определением он возвращает true, если для потока данных установлен бит failbit или badbit. Возможный вариант использования: If (! std::с1п) { Поток cm находится в ошибочном состоянии Как и в случае с неявным преобразованием к логическому типу, этот оператор часто используется для совмещения чтения с проверкой результата: if (! (std::С1П х)) { Попытка чтения завершилась неудачей Следующее выражение возвращает объект cin, к которому применяется оператор !; std::С1п X Выражение после оператора ! необходимо заключить в круглые скобки из-за относительного приоритета операторов; без круглых скобок оператор ! будет выполнен первым. Другими словами, следующие два выражения эквивалентны: !std::С1п X (!std::cin) х Вряд ли это именно то, к чему стремился программист. Хотя описываемые операторы очень удобны, следует обратить внимание на одну странность: двойное отрицание не означает возвращения к исходному объекту: О cin - потоковый объект класса istream; О !!cin - логическая велт-гчина, описываюп1ая состояние объекта cin. Существует мнение, что преобразование к логическому значению не соответствует принципам хорошего стиля программирования. Функции типа fail() обычно делают программу более понятной: std::с1п х; If (std::c1n.fa1l()) ( Состояние потока данных и исключения Механизм обработки исключений был включен в С++ д.ля выявления ошибок и особых ситуаций (см. с. 31). Тем ие менее это было сделано уже после того, как потоки данных получили широкое распространение. Чтобы сохранить совместимость, потоки данных по умолчанию не генерируют исключений. Однако для каждого флага состояния стандартизированных потоков данных можно указать, до.лжна ли установка этого флага сопровождаться выдачей исключения. Для этой цели используется функция exceptions() (табл. 13.6).
При вызове без аргументов функция exceptions() возвращает текущие флаги, при установке которых генерируются исключения. Если функция возврашает goodbit, исключения не генерируются. Этот режим используется по умолчанию для поддержания совместимости. Если функция exceptions() вызывается с аргументом, то сразу же после установки соответствующего флага состояния будет выдано исключение. Следующий пример настраивает поток данных так, чтобы при установке любого флага генерировалось исключение: Генерировать исключение при любой ошибке strm.exceptions (std::los::eofb1t std::1os::failbit std::1os::badb1t): Если аргумент равен О или goodbit, исключения не генерируются: Не генерировать исключения strm.exceptions (std::ios::goodb1t); Исключения генерируются при установке соответствующих флагов после вызова с1еаг() или setstate(). Это происходит даже в том случае, если флаг был установлен ранее: Вызов генерирует исключение, если флаг failbit был установлен при входе strm.exceptions (std::10S::fa1lb1t); Следующая команда генерирует исключение [даже если флаг failbit был установлен ранее) strm.setstate (std::1os::failbit): Генерируемые исключения являются объектами класса std::ios base:;failure, производного от класса exception (см. с. 43). namespace std { class 1os base::failure : public exception { public: Конструктор explicit failure (const string& msg); Деструктор virtual -fallureO; Возврат информации об исключении
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |