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


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


void mumble 0 {

    // правильно: программа по-прежнему содержит ошибку,

    // но теперь она компилируется!

    // Прежде всего нужно проверить

    // явные преобразования типов...

 

    pc = static_cast< char* >( pv );

 

    char *pstr = new char[ str1en( pc )+1 ];

 

    // скорее всего приведет к краху

    strcpy( pstr, pc );

}

Другой причиной использования явного преобразования типов может служить необходимость избежать стандартного преобразования или выполнить вместо него собственное. Например, в следующем выражении ival

сначала преобразуется в double, потом к нему прибавляется dval, и затем результат снова трансформируется в int.

double dval;

int iva1;

ival += dval;

Можно уйти от ненужного преобразования, явно заменив dval на int:

ival += static_cast< int >( dval );

Третьей причиной является желание избежать неоднозначных ситуаций, в которых возможно несколько вариантов применения правил преобразования по умолчанию. (Мы рассмотрим этот случай в главе 9, когда будем говорить о перегруженных функциях.)

Синтаксис операции явного преобразования типов таков:

cast-name< type >( expression );

Здесь cast-name – одно из ключевых слов static_cast, const_cast, dynamic_cast или reinterpret_cast, а type – тип, к которому приводится выражение expression.

Четыре вида явного преобразования введены для того, чтобы учесть все возможные формы приведения типов. Так const_cast

служит для трансформации константного типа в неконстантный и подвижного (volatile) – в неподвижный. Например:

extern char *string_copy( char* );

const char *pc_str;

 

char *pc = string_copy( const_cast< char* >( pc_str ));

Любое иное использование const_cast вызывает ошибку компиляции, как и попытка подобного приведения с помощью любого из трех других операторов.

С применением static_cast

осуществляются те преобразования, которые могут быть сделаны неявно, на основе правил по умолчанию:

double d = 97.0;

<


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



Книжный магазин