旧的C风格转型几乎允许你把任何类型转换成任何其他类型(当然有些限制)
由于他的功能太强大,对于程序员阅读这样的程序会带来很大的识别障碍
几乎所有的工作都用(type)expression的方式进行转换
为此C++提供了4种新的转型操作符号(cast operation)
static_cast,const_cast,dynamic_cast和reinterpret_cast
1.static_cast
static_cast基本拥有c风格转型差不多的功能,和相同的限制。比如int向double的转换
int testNum;
static_cast<double>testNum;
同样你也不能将int或者struct转换成pointer,这个转换在c里面也是不允许的
值得注意的是static_cast不支持const向non-const的互相转换,就是说不能排除表达式的常量性
const_cast负责这一功能
2.const_cast
const_cast专注于这一功能,应用面很狭窄,大使增加了可读性。
class A{...}
class AB:public A{...}
void Update(AB* xy);
AB ab;
const AB& cab = ab;
Update(&cab);//这样是错误的
Update(const_cast<CAB*>(&cab));//正确,去掉了常量性
但是 const_cast不支持带有继承关系的转换
A* pa = new AB;
Update(const_cast<AB*>pa);//这样是错误的
现在我只需要记住。const_cast最重要的作用就是去除常量性
3.dynamic_cast
用来执行继承体系中安全的向下转型或者跨系转换,上面的操作用dynamic_cast是可以支持的
A* pa = new AB;
Update(dynamic_cast<AB*>pa);
注意的是关于此操作符的返回值
如果表达式是pointer ,转换失败的话会得到一个NULL
如果............是ref ,........................会抛出一个异常
dynamic_cast只能做这一类型的转换,请不要尝试去用dynamic_cast改变表达式的常量性,也无法在缺乏虚函数的型别上使用(比如int to double,这样的转换得使用static_cast)
4.reinterpret_cast
这个我了看的不是很透,资料上说与编译环境相关,不具备移植性。
他最常用途是转换(函数指针)的型别
有一个保存函数指针的数组,里面指针指向函数的return 都是void
但是你现在有个函数return为int,这个时候如果你想把这个函数放进funcPtrArray
如果没有转型是可能实现的
typedefine void (*FuncPtr())
int func();
funcPtrArray[0] = &func;//错误,型别不对
funcPtrArray[0] = reinterpret_cast(FuncPtr)(&func);//正确