Язык программирования C++. Вводный курс


Явное преобразование типов - часть 3


/p>

char ch = static_cast< char >( d );

Зачем использовать static_cast? Дело в том, что без него компилятор выдаст предупреждение о возможной потере точности. Применение оператора static_cast

говорит и компилятору, и человеку, читающему программу, что программист знает об этом.

Кроме того, с помощью static_cast

указатель void*

можно преобразовать в указатель определенного типа, арифметическое значение – в значение перечисления (enum), а базовый класс – в производный. (О преобразованиях типов базовых и производных классов говорится в главе 19.)

Эти изменения потенциально опасны, поскольку их правильность зависит от того, какое конкретное значение имеет преобразуемое выражение в данный момент выполнения программы:

enum mumble { first = 1, second, third };

 

extern int ival;

mumble mums_the_word = static_cast< mumble >( ival );

Трансформация ival в mumble

будет правильной только в том случае, если ival равен 1, 2 или 3.

reinterpret_cast

работает с внутренними представлениями объектов (re-interpret – другая интерпретация того же внутреннего представления), причем правильность этой операции целиком зависит от программиста. Например:

complex<double> *pcom;

char *pc = reinterpret_cast< char* >( pcom );

Программист не должен забыть или упустить из виду, какой объект реально адресуется указателем char* pc. Формально это указатель на строку встроенного типа, и компилятор не будет препятствовать использованию pc для инициализации строки:

string str( pc );

хотя скорее всего такая команда вызовет крах программы.

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

Особенно трудно найти подобную ошибку, если явное преобразование типа делается в одном файле, а используется измененное значение в другом.




Начало  Назад  Вперед