(本节内容在Effective C++ 28中亦有涉及)
前言
类型转换这种东西c语言就有,但是过于粗鲁(允许任何类型之间的相互转换)也难以识别(因为它用圆括号和标识符)
c++引入了四种类型转换,分别是static_cast,const_cast,dynamic_cast以及reinterpret_cast.
四种类型转换的作用
static_cast
强制隐式类型转换,其特点在于无法去除const属性。
const_cast
const_cast用于去除表达式的const或volatileness属性。
dynamic_cast
dynamic_cast可以把指向bc的指针或者引用改为指向dc的,转换失败则返回空指针(转换指针)或者抛出异常(转换引用)实例如下:1
2
3
4
5
6
7
8class Widget { ... };
class SpecialWidget: public Widget { ... };
void update(SpecialWidget *psw);
Widget *pw;
...//指向某个SpecialWidget对象
update(dynamic_cast<SpecialWidget*>(pw));
void updateViaRef(SpecialWidget& rsw);
updateViaRef(dynamic_cast<SpecialWidget&>(*pw));
reinterpret_cast
reinterpret_cast的操作结果几乎都是执行期定义(很难移植),一般用作函数指针类型之间的切换,实例如下:1
2typedef void (*FuncPtr)(); //一个函数指针,该函数没有参数 返回值类型为void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳10个FuncPtrs指针的数组
当前我们希望把下面这个函数指针放入数组内:int dosth()
当然这必须要使用类型转换,于是有:1
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);