Нам осталось рассмотреть еще операторы reinterpret_cast и const_cast. Эти операторы используются намного реже. Вначале рассмотрим reinterpret_cast.
Оператор reinterpret_cast является небезопасным, так как позволяет осуществлять бесконтрольное преобразование типов, которые запрещены правилами C++. Рассмотрим пример.
#include <iostream> using namespace std; class First { public: void info() { cout<<"First"<<endl; } }; class Second { public: void info() { cout<<"Second"<<endl; } }; void main() { First first; Second second; First *pfirst; Second *psecond; pfirst = reinterpret_cast<First*>(&second); pfirst->info(); psecond = reinterpret_cast<Second*>(pfirst); psecond->info(); }
Мы можем преобразовать указатель одного типа к указателю другого типа, хотя класс Second не является производным от First. Использование оператора reinterpret_cast лучше вообще избегать или использовать только в том случае, если это реально обоснованно.
Теперь рассмотрим оператор const_cast. Он используется, когда необходимо снять статус константности с переменной или объекта. Рассмотрим пример.
#include <iostream> using namespace std; void main() { const int t = 99; int *ptr; ptr = const_cast<int*>(&t); }
Адрес константы t можем присвоить только указателю на константу. Но, указатель ptr представляет собой обычный int указатель. Поэтому, с помощью оператора const_cast мы можем указателю ptr присвоить адрес константы t.