旧式C强制类型转换的缺点
1、几乎任何类型都可以随意转换,差异太大; 2、难以辨识,C强制类型转换使用()和类型名,不易和其他区分;
C++导入了4个新型转型操作符
static_cast
const_cast
dynamic_cast
reinterpret_cast
虽然长得复杂,但是一眼就能看出来是转型操作
stactic_cast
与旧式C转型相似,不能将struct转为int、不能将double转为指针。 它也不能移除表达式的常量特性,不过const——cast可以。
const_cast
它只能改变表达式的常量性和变易性,用在其他地方无效 且const_cast类型必须完全匹配,类继承时的父类类型无法使用子类类型的const_cast进行向下转型
const int p = 100;
int i = const_cast<int> p;
dynamic_cast
执行继承体系中的向下或跨系转型; 表达式会告知转型结果,如果失败,会以空指针或exception异常(引用类型时)表现出来;
class Widget{...};
class SpecialWidget: public Widget{...};
Widget *pw;
update(dynamic_cast<SpecialWidget*>(pw));
update(dynamic_cast<SpecialWidget&>(*pw));
主要引用于继承体系,无法应用于缺乏虚函数的类型身上,也不可改变常量性
如果不涉及继承类型的转型操作,static_cast
reinterpret_cast
转换结果与编译平台息息相关,所以它不具有移植性 最常用用途:转换函数指针类型
typedef void (*FuncPtr)();
FuncPtr funcPtrArray[10];
int doSomething();
此时想要将这个函数存入数组 不可能直接插入,返回值类型不同
funcPtrArray[0] = reinterpret_cast<FuncPtr> (&doSomething);
移植性差,尽量避免使用
C++转型符优点
严谨、易辨识、容易被解析、编译器可以诊断转型错误
|