Void f1 ( const int * a ){
int * p = const_cast< int * > ( a );
*p = *a * *a;
}
Void f2 ( const int& a){
const_cast<int & > ( a ) = a * a;
}
Int main () {
int i = 2;
cout << i << " " ;
f1 (&i);
cout << i << " ";
f2( i );
cout << i << " ";
return 0 ;
}
2.27
Оператор reinterpret_cast.
reinterpret_cast < type > ( expr )
Особенности:
используется для работы с битовыми областями данных - преобразования несовместимых типов указателей, а также для преобразования целых типов в указатели и наоборот
нельзя использовать для преобразования типов с const и volatile
не рекомендуется к использованию ( не безопасен )
expr - выражение, которое приводится к новому типу
type - результирующий тип
#include <iostream>
using namespace std;
Int main(){
char *s = "string";
int i = reinterpret_cast < int > ( s );
cout << i;
return 0;
}
2.28
Оператор static_cast.
static_cast < type > ( expr )
Особенности:
используется для неполиморфного приведения типов - можно применять для любого стандартного приведения типов как и обычный оператор приведения
может быть применен для преобразования указателя на базовый класс к указателю на производный класс, но это не всегда безопасно и никаких проверок во вермя преобразования не производится
нельзя использовать для преобразования типов с модификаторами const и volatile
2.29
Оператор dynamic_cast.
Особенности:
используется для динамического приведения полиморфных типов ( указателей или ссылок ) с проверкой корректности приведения во время выполнения программы
если приведение оказывается некорректным, то оно не выполняется - формируется признак ошибки
нельзя использовать для преобразования типов с const и volatile
expr - выражение, которое приводится к новому типу, должно вычислять указатель или ссылку
type - результирующий тип ( указатель или ссылка )
Правила приведения полиморфных типов:
оператор dynamic_cast выполняется успешно, если указатель или ссылка, подвергающаяся приведению, в момент приведения ссылается на объект результирующего еласс или производного от результирующего
при невозможности динамического приведения возвращается нулевой указатель ( применитльно к указателям ) или генерируется исключительная ситуация bad_cast ( применительно к ссылкам )
Если даны класс Вase и производный от него класс Derived:
приведение указателя Derived* к типу Вase* возможно ВСЕГДА - по стандартным правилам наследования указатель на базовый класс может ссылаться на объект производного класса
приведение указателя Base* к типу Derived* возможно лишь в случае, когда указатель Base* в момент приведения действмительно ссылается на объект класса Derived
2.30Применение оператора dynamic_cast к шаблонным классам
