warning:虽然有时候不得不使用强制类型转换,但这种方法本质上是非常危险的!
命名的强制类型转换:
形式:
cast-name<type>(expressopn)
//type是expression要转换的值。如果type是引用类型,则结果是左值。
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
//进行强制类型转换以便执行浮点数除法
double slope = static_cast<double>(j) / i;
当需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用。(可以屏蔽编译器的警告信息,因为我们明确告知编译器不在乎损失潜在的精度)
对于编译器无法自动执行的类型转换也非常有用。
eg:
//使用static_cast找回存在于void*指针中的值
void* p = &d;
double *dp = static_cast<double*>(p) ;
这样操作时要注意确保指针的值保持不变。
也就是说强制转换的结果将与原始的地址值相等,因此我们必须确保转换后所得的类型就是指针所指的类型。类型一旦不符,将产生未定义的后果。
const_cast
只能改变运算对象的底层const,不能用其改变表达式的类型。
const char *pc;
char *p = const_cast<char*>(pc);//正确,但通过p写值是未定义的行为
//上述行为我们一般称其为“去掉const性质“
reinterpret_cast
使用该转换是非常危险的,其本质上依赖于机器。
为运算对象的为模式提供较低层次上的重新解释。
eg:
int *ip;
char *pc = reinterpret_cast<char*>(ip)
//pc所指的真实对象是一个int而非字符!
string str(pc);//错误,会产生导致异常运行的行为!