c++显式转换-笔记

来源:互联网 发布:手机粉碎软件 编辑:程序博客网 时间:2024/04/28 23:14
c++显示转换:static_cast、dynamic_cast、const_cast和reinterpret_cast


命名的强制类型转换符号的一般形式为:cast-name<type>(expression),其中cast-name为static_cast、dynamic_cast、const_cast和reinterpret_cast之一,type为转换的目标类型,expression为被强制转换的值


1、dynamic_cast:只用于对象的指针和引用,当用于多态类型时,它允许任意的隐式类型转换以及相反的过程,它可以将基类类型对象的引用或者指针转换成同一继承层次中其他类型的引用或者指针,和dynamic_cast一起使用的指针必须有效(必须为0或者指向一个对象),和其他强制类型转换不同的是 dynamic_cast 涉及运行时类型检查;如果绑定到引用或者指针的对象不是目标类型对象,则 dynamic_cast 失败,如果转换到指针类型的 dynamic_cast 失败,则 dynamic_cast 的结果是0值,如果转换到引用类型的 dynamic_cast 失败,则抛出一个 bad_cast 类型的异常;
dynamic_cast 操作符一次执行两个操作,它首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。一般引用或者指针所绑定的对象类型在编译时是未知的,基类的指针可以赋值为指向派生类对象,同样,基类的引用也可以用派生类的对象初始化,因此,dynamic_cast 操作符执行的验证必须在运行时进行

例:
Base 为至少带一个虚函数的基类, Derived 类为 Base 的派生类,一个指针 basePtr 指向 Base 基类,就可以在运行时进行强制转换为指向 Derived 的指针:
if(Derived *derivedPtr = dynamic_cast<Derived*>(basePtr))
{
}
else
{
}
运行时,如果 basePtr 实际指向 Derived 对象,则转换成功,否则转换结果为 0;


2、const_cast:转换掉表达式的 const 性质,除了添加和删除 const 特性,用 const_cast 符来执行其他任何类型转换,都会引起编译错误,对于常量表达式,试图使用其他三种转换类型都会导致错误;
如:const char *pc;
char *p = const_cast<char *>(pc)


3、static_cast:编译器隐式执行的任何类型转换都可以有 static_cast 显示完成;


4、reinterpret_cast:通常为操作数的位模式提供较低层次的重新解释,它本质上依赖于机器,为了安全地使用reinterpret_cast,要求程序员完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节;
原创粉丝点击