一、C++ 强制类型转换
命名的强制类型转换具有如下形式:
cast-name<type>(expression);
type 是转换的目标类型,expression 是需要转换的值。cast-name 是 static_cast 、 dynamic_cast 、 const_cast 、 reinterpret_cast 中的一种。 cast-name 指定了执行的是那种转换。
1. static_cast
任何具有明确定义的类型转换,只要不包含底层 const ,都可以使用static_cast。
double d_pi = 3.1415;
int i_pi = static_cast<int>(d_pi); //i_pi的值为3
void* p = &d_pi;
int* i_p = static_cast<int*>(p); //编译通过, 但将double* 转成了 int*, *i_p 是未定义行为
double* d_p = static_cast<double*>(p) //正确, *d_p = 3.1415
这里需要注意,在指针操作时,将 double* 存放到 void* 的 p 中,在强制转换到 int* 的 i_p 时,类型不符,但不会编译报错,运行时会发生未定义行为。只有转换回原来的类型时,才是正确的行为。但它并不会为你进行类型检查。这存在安全隐患,还有基类和派生类的指针相互转换,也存在隐患,都需要开发者来维护。
2. const_cast
const_cast 只能改变运算对象的底层 cosnt ,常用于修改指针和指针的 const 性质。一旦去掉 const 性质,便可以获取写