Effective C++ 条款27 尽量少做转型操作
1. 转型语法有三种,
C风格转型:(T)expression
函数风格转型:T(expression)
两种方式除了小括号位置不同没有差别,可以称为"旧式转型".
C++提供四种新式转型:
const_cast<T>(expression):
将const变量引用或指针转为非const引用或指针,移除变量的常量特性.T必须是指针或引用.
注:虽然经const_cast转型后的变量可以被更改,但由于"常量折叠"(c++编译器在编译时将const 变量替换为对应常量),原变量的值表现出未更改的性质(只有内置类型才会有这种现象).
reinterpret_cast<T>(expression):
变量二进制位层次上的重新解释,并没有对变量的二进制储存方式进行更改.T必须是指针,引用或算术类型.
dynamic_cast<T>(expression):
在执行期进行多态类(有虚函数)之间的转换,用于运行时类型识别.T必须是指针或引用,expression必须返回多态类类型.
如果T是指针,转换失败时会返回NULL,如果T是引用,转换失败时会抛出异常.
static_cast<T>(expression):
可以执行大多数类型的转换,但与const_cast类型相比,static_cast不能去除const或volatile属性,与dynamic_cast相比不支持运行时类型识别,与reinterpret_cast相比不是位层次上的重新解释,而是对位进行改变后的重新编码.
2. static_cast与返回值的函数类似,返回的是一个临时副本,例如:
int a; static_cast<double>(a)=2.0;
并不会改变a的值,因此除非像dynamic_cast,const_cast一样转为指针和引用,否则不要对转换后的对象进行操作.
此外,dynamic_cast在成功进行downcast或upcast时会进行指针地址的重定向(这由C++面向对象模型决定),因此dynamic_cast与static_cast在进行类类型之间的转换上操作也有所不同.
3. 尽量使用C++的新式转型操作取代C的旧式转型,前者分类更加精确,可以明确指出转型意图,便于找出错误.
如果可以,尽量避免转型操作,特别是避免像dynamic_cast这种运行时进行类型识别而导致效率低的操作;