强制类型转换包括以下名字命名的强制类型转换操作符:static_cast dynamic_cast const_cast reinterpret_cast 。
1、何时需要强制类型转换
因为要覆盖通常的标准转换,所以需显示使用强制类型转换。下面的复合赋值:
double dval;
int ival;
ival *= dval; 为了与dval做乘法操作,需将ival转换为double型,然后将乘法操作的double型结果截尾为int型,在赋值给ival。为了去掉将ival转换为double型这个不必要的转换,可通过如下强制将dval转换为int型:
ival *= static_cast<int>(dval);
2、命名的强制类型转换
命名的强制类型转换符号的一般形式如下:
cast-name<type>(expression);其中cast-name为static_cast dynamic_cast const_cast reinterpret_cast 之一,type为转换的目标类型,而expression则是被类型强制转换的值。
3、dynamic_cast 支持运行时识别指针或引用所指向的对象。
4、const_cast将转换掉表达式的const性质,例如,假设有函数string_copy,只有唯一的参数,为char*类型,我们对访问函数时,如让它接受const char *类型的参数,可通过const_cast用一个const值调用string_copy函数:
const char * pc_str;
char * pc = string_copy(const_cast<char *>(pc_str));
只有使用const_cast才能将const性质转换掉。其他三种不行,会导致编译时错误。
5、static_cast 编译器隐式执行的任何类型转换都可以由static_cast显式转换。
6、reinterpret_cast 通常为操作数的位模式提供较低层次的重新解释。
例如: 对于下面的强制转换:
int * ip;
char * pc = reinterpret_cast<char *>(ip);
程序员必须永远记得pc所指向的真实对象其实是int型,而并非字符数组。任何假设pc是普通字符指针的应用都有可能带来运行时错误。