До того как эти операторы были включены в стандарт использовалось явное преобразование типов, например:
struct A
{
int i;
}
struct B
{
float f;
}
A* a = new A;
B* b = (B*)a;
b->f = 123.456
при записи значения будет затронута память не принадлежащая переменной класса A, т.к. sizeof(float) > sizeof(int)
Такое преобразование не безопасно, поэтому и были добавлены операторы пребразование типов, они перекладывают работу по определению корректно ли преобразование типов с програмиста на компилятор (что не может не радовать=)
Теперь мы можем написать так:
B* b = static_cast<B*>(a);
и быть абсолютно уверенными в том, что компилятор такого не допустит
с dynamic_cast немного по-другому:
B* b = dynamic_cast<B*>(a);
if( b != NULL )
{
Error("указатель на A нельзя преобразовать к указателю на B");
}
разница в том, что static_cast работает на этапе компиляции, а dynamic_cast во время выполнения
const_cast подобен static_cast, но может убирать модификаторы const и volatile
const int i = 1;
int* j = const_cast<int*>(&i);
j = 123;
1153: текст поста до правкиДо того как эти операторы были включены в стандарт использовалось явное преобразование типов, например:
struct A
|
int i;
"
struct B
|
float f;
"
A* a = new A;
B* b = )B*:a;
b->f = 123.456
при записи значения будет затронута память не принадлежащая переменной класса A, т.к. sizeof(float) > sizeof(int)
Такое преобразование не безопасно, поэтому и были добавлены операторы пребразование типов, они перекладывают работу по определению корректно ли преобразование типов с програмиста на компилятор (что не может не радовать=)
Теперь мы можем написать так:
B* b = static_cast<B*>)a:;
и быть абсолютно уверенными в том, что компилятор такого не допустит
с dynamic_cast немного по-другому:
B* b = dynamic_cast<B*>)a:;
if) b != NULL :
|
Error)"указатель на A нельзя преобразовать к указателю на B":;
"
разница в том, что static_cast работает на этапе компиляции, а dynamic_cast во время выполнения
const_cast подобен static_cast, но может убирать модификаторы const и volatile
const int i = 1;
int* j = const_cast<int*>)&i:;
j = 123;