2.C++式类型转换

(本节内容在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
8
class 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
2
typedef void (*FuncPtr)(); //一个函数指针,该函数没有参数 返回值类型为void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳10个FuncPtrs指针的数组

当前我们希望把下面这个函数指针放入数组内:int dosth()当然这必须要使用类型转换,于是有:
1
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);