C++中的类型转换

C++中的类型转换

和goto语句一样类型转换的名声似乎也是不那么好。
不过类型转换在某些紧要关头就显得尤为重要,看看现有的C/C++代码就知道,以至于你不理解转换的作用,代码将是无法阅读的。
就像铀,它能变成原子弹,但它也能用来发电,是灾难还是福祉那就要看人类了。
显然类型转换默默承受着这不公的一切。
不管怎么说C风格的类型转换还是不尽人意的:
1.它们很粗糙,你可以通过它们在任意类型之间进行转换,没有明确指定每个转换的目的。
2.C风格的类型转换很难进行查找。它们是由一对括号加上一个类型标识组成的,而括号和类型标识在C++里到处都是。
C++通过引进4种类型的类型转换操作符克服了C风格的类型转换的缺点。
static_cast
const_cast
dynamic_cast
reinterpret_cast
关于这些操作符应该知道的是,你习惯的写法:
(type) expression
现在都应该写成
static_cast<type>(expression)
它与C风格的类型转换有同样的限制,例如不能把结构(struct)转换成int,不能把double转换成指针。
const_cast是用来去掉一个表达式的const属性或者volatile属性(至于volatile在C++中的含义可以google一下便知道)
dynamic_cast用来对一个继承体系做向下或者横向的安全转换,也就是把基类的指针(引用)转换成派生类或者基类的兄弟类指针(引用),很重要的一点可以知道转换是否成功。空指针,异常(引用)意味着转换失败。
dynamic_cast仅限于用来操纵继承体系。而最后一种
reinterpret_cast最常见的用法就是用来在函数指针之间进行类型转换。
typedef void (*FuncPtr)();
FuncPtr funcPtrArray[10];
int doSomething();
funcPtrArray[0] = &doSomething;//错误,类型不匹配
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
把上面这个函数的指针放入funcPtrArray中,如果不进行类型转换就不可能办到。
C++新的类型转换既难看又难输入(这个很大程度上是设计者故意的,因为可以迫使使用者尽量不进行类型转换),但是C风格的类型转换仍然可用。正因为新的类型转换缺少美感,使得它有着确切的含义并且容易识别。
<<More Effective C++>>的作者Scott Meyers强烈建议使用新的类型转换运算符,这些C++大师的建议应该是值得采纳的。

posted @ 2012-10-15 22:47  可乐爱上了雪碧  阅读(174)  评论(0编辑  收藏  举报