标签:c++ 类型转换
类型转换,在程序设计中是令人鄙视,无法忍受的存在,但是在某些时候,类型转换又是必须的。
在C语言中,类型转换经常用圆括号和一些标识符组成,但是这种转换形式很不容易被发现,在阅读上也造成了一定的困难。
在C++中,虽然也兼容老式的C语言转换风格,但是更推荐使用C++风格的类型转换:static_cast,
const_cast, dynamic_cast, reinterpret_cast。对于这四种类型转换的用法,我将对自己恶补一下。
首先是 static_cast,功能上基本与C风格的类型转换一样强大,所以基本上不知道怎么用类型转换的时候,就可以使用它。
1)用于基本数据类型之间的转换,如把int转换成char, 把int转换成double等。
2)把空指针转换成目标类型的空指针。
3)把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const,volatile,或者__unaligned属性。
其次是 const_cast,它的用途基本上可以直接理解为转换掉对象的const属性。
再次是 dynamic_cast,它被用于安全地沿着类的继承关系向下进 行类型转换。这就是说,你能用 dynamic_cast 把指向基类的指针或引用转换成指向其派生 类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对 指针进行类型转换时)或者抛出异常(当对引用进行类型转换时) 。
最后是 reinterpret_cast,最普通的用途就是在函数指针类型之间进行转换 。例如:
typedef void (*FuncPtr)(); // FuncPtr是指向函数的指针,没有参数,返回类型为void
FuncPtr funcPtrArray[10]; // funcPtrArray 能容纳10个FuncPtr的数组。
int doSomething(); // 处于某些奇葩因素,想要转换的函数。
funcPtrArray[0] = &doSomething; // 错误!类型不匹配
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // 正确
注意:转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表
示),在一些情况下这样的转换会产生不正确的结果
以上是我对四种类型转换的一个解读,如果有错误的地方,还请各位大神们帮忙纠正。
本文出自 “Jimmy恶补C++” 博客,请务必保留此出处http://jimmystar.blog.51cto.com/3716199/1584072
标签:c++ 类型转换
原文地址:http://jimmystar.blog.51cto.com/3716199/1584072