Глава 9. Описатели и спецификаторы данных________________________219
int input = get О; // Вводим "А"
cout « (char)input; // Переводим из целочисленного типа // в символьный
ИЛИ
cout « char(input); // Тоже приведение типов, но похоже на вызов // функции.
! Предупреждение
Последний вариант приведения типов можно легко спутать с вызовом функции, особенно, если задействованные типы не являются базовыми. Базовый тип даже новичка заставит обратить на себя внимание, но использование
cast( var) ;
с типом, определенным пользователем, более чревато ошибками, чем
(cast) variable
что на вызов функции совсем не похоже.
Приведение типов просто напрашивается на то, чтобы его снабдили комментариями. Опишите, зачем потребовалось приведение типов и какое влияние оно окажет (если окажет) на данные.
В результате приведения типов в любой из этих форм целочисленный тип переводится в символьный. В зависимости от вида преобразования какая-то часть информации может быть утрачена.
Вследствие строгой типизированности языка C++ вы не можете требовать от компилятора, чтобы он угадывал ваши намерения. Это значит, что сам компилятор не будет производить приведение типов; более чем вероятно, что он выразит свой протест.
Представление данных одного типа в виде данных другого типа подразумевает возможность потери информации. Символ — 8-битная величина, целое же число представляется в 32-битном виде. В нашем примере состояние остальных 24 бит игнорируется. Приведение типов следует применять только тогда, когда, как в этом случае, вы уверены, что состоянием игнорируемых битов можно пренебречь.
Некоторые из существующих функций могут ожидать указателя void*, тогда как вам может быть удобнее использовать указатель другого типа. Такие преобразования являются довольно обыденными — используйте их, если точно знаете, что из себя представляют ваши данные и уверены в своих намерениях. Однако имея дело с составными типами, такими как структуры и классы, часто предпочтительнее использовать операции преобразования. Эти операции рассматриваются в главе 14 "Базовые концепции классов". Если вам нужна еще информация о типах и методах преобразования — можно посмотреть главу 23 "Динамическая идентификация типов".