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这种运行时进行类型识别而导致效率低的操作;

 

posted @ 2015-09-01 00:11  Reasno  阅读(316)  评论(0编辑  收藏  举报