显式转换也成为强制转换(cast), 有如下几种类型:static_cast, dynamic_cast, const_cast, reinterpret_cast。
1. const_cast: 将转换掉表达式的const性质。
const char *pc_str;
char *pc = string_copy( const_cast<char*>(pc_str) );
2. static_cast: 编译器隐式执行的任何类型转换都可以由static_cast显示完成。
double d = 97.0;
char ch = static_cast<char>(d);
3. reinterpret_cast 通常为操作数的位模式提供较低层次的重新解释。为了安全地使用reinterpret_cast,要求程序员完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节。
int *ip;
char *pc = reinterpret_cast<char*>(ip);
在这里要注意,虽然强制转换类型可以通过,但是pc实际上是指向int型对象的指针,并非字符数组。任何假设pc是普通字符指针的应用,都有可能带来有趣的运行时的错误。比如:
string str(pc)。
4. dynamic_cast: 将基类类型对象的引用或指针转换为同一继承层次中其它类型的引用或指针。这个指针必须是有效的--为0或者指向一个对象。
与其他强制类型转换不同,dynamic_cast涉及运行时类型检查。如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败。如果转换到指针类型失败,则dynamic_cast返回的值为0;如果转换到引用类型失败,则抛出一个bad_cast类型的异常。
所以,dynamic_cast操作符一次执行两个操作。一:首先检查转换是否有效。二:实际进行转换。一般而言,引用或指针所指向的对象的类型在编译时是未知的(因为“多态”)。因此,dynamic_cast操作符指向的验证必须在运行时进行。