1. C++的cast精准,而C的cast模糊
类型转换是经常出问题的地方,需要小心运用,尽量避免模糊的语义。
l C式的cast,形似type(…),与非cast形式的构造函数调用相同,不易区别。
l C式的cast功能强大,甚至可以将const变量转换成非const的变量,而调用者却毫无察觉,非常危险。
const int a = 123;
int b = (int)a; //
Danger
// 旧式cast转换函数指针类型。
typedef (*VoidFun)();
int IntFun();
VoidFun vf = VoidFun(IntFun); // Syntax right, but
DANGER.
l C++的cast提供了四种类型的转换运算符,可以根据具体的需要选择,并且可以
精准地描述调用者的意图。比如const_cast就是为了去掉const或者volatile修饰符,dynamic_cast就是为了向下安全转换,static_cast为了替换原来的隐式转换;reinterpret_cast就是为了在不相关的类型间转换(包括不同类型的函数指针)。
2. dynamic_cast的限制
l 仅在运行时cast。
l 仅应用于指针和引用的cast。
l 仅应用于拥有多态的对象。
3. reinterpret_cast的使用注意事项
l reinterpret_cast可以在不相关的指针类型间转换。【static_cast不能做到。】
l reinterpret_cast通常用以转换函数指针的类型。【static_cast不能做到。】
l 转换函数指针的结果可能不正确,而且各个编译器的实现未必相同,所以reinterpret_cast转换函数指针不能在平台间移植。