static_cast,dynamic_cast,const_cast,reinterpret_cast使用总结
来源:互联网 发布:多线程编程demojava 编辑:程序博客网 时间:2024/06/08 16:02
1)c++类型转换分为两种:
1, 隐式转换:如int 转float,float转double
2, 显式转换:四种显式转换类型:static_cast,dynamic_cast,const_cast,reinterpret_cast
2)static_cast:
转换格式:static_cast<type_id>(expression)
功能:主要用于非多态类型间的转换,不提供运行时的检查来保证转换的安全性
使用场合:1,基类和子类间指针和引用转换,子->基 安全,基->子不安全需程序员保证;2,基本类型间转换,如int->char,int->enum不安全;3,void*转换为目标类型极其不安全
例子:static_cast<QMouseEvent*>(event);//event QEvent
3)dynamic_cast:
转换格式:dynamic_cast<type_id>(expression) //type_id 和expression类型必须一致,指针不能对应引用
功能:主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
使用场合:上行转换与static_cast功能相同,下行转换具有类型检查的功能,更加安全。
- 如果expression是type-id的基类,使用dynamic_cast进行转换时,在运行时就会检查expression是否真正的指向一个type-id类型的对象,如果是,则能进行正确的转换,获得对应的值;否则返回NULL,如果是引用,则在运行时就会抛出异常;
例子:
class A4.如果expression是type-id的基类,使用dynamic_cast进行转换时,在运行时就会检查expression是否真正的指向一个type-id类型的对象,如果是,则能进行正确的转换,获得对应的值;否则返回NULL,如果是引用,则在运行时就会抛出异常;{public: virtual void f(){} // ......};class B{public: virtual void f(){} // ......};int main(){ A *pA = new A; B *pB = new B; void *pV = dynamic_cast<void *>(pA); // pV points to an object of A pV = dynamic_cast<void *>(pB); // pV points to an object of B}对于一些复杂的继承关系来说,使用dynamic_cast进行转换是存在一些陷阱的;
class A{ virtual void Func() = 0;};class B : public A{ void Func(){};};class C : public A{ void Func(){};};class D : public B, public C{ void Func(){}};int main(){ D *pD = new D; A *pA = dynamic_cast<A *>(pD); // You will get a pA which is NULL}
如果进行上面的直接转,你将会得到一个NULL的pA指针;这是因为,B和C都继承了A,并且都实现了虚函数Func,导致在进行转换时,无法进行抉择应该向哪个A进行转换。正确的做法是:
int main(){ D *pD = new D; B *pB = dynamic_cast<B *>(pD); A *pA = dynamic_cast<A *>(pB);}
4)const_cast:
转换格式:const_cast <type-id> (expression)
功能:用来将类型的const、volatile和__unaligned属性移除。常量指针被转换成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然引用原来的对象
使用场合:你不能直接对非指针和非引用的变量使用const_cast操作符去直接移除它的const、volatile和__unaligned属性。
5) reinterpret_cast
转换格式:reinterpret_cast <type-id> (expression)
允许将任何指针类型转换为其它的指针类型;听起来很强大,但是也很不靠谱。它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原来的指针值;特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。
- C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结
- static_cast,dynamic_cast,const_cast,reinterpret_cast使用总结
- C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结
- reinterpret_cast,const_cast,static_cast,dynamic_cast 总结
- reinterpret_cast,const_cast,static_cast,dynamic_cast 总结
- reinterpret_cast,const_cast,static_cast,dynamic_cast 总结
- reinterpret_cast,const_cast,static_cast,dynamic_cast 总结
- reinterpret_cast,const_cast,static_cast,dynamic_cast 总结
- static_cast、dynamic_cast、const_cast、reinterpret_cast总结
- dynamic_cast、const_cast、static_cast、reinterpret_cast
- static_cast, dynamic_cast, const_cast, reinterpret_cast
- const_cast,reinterpret_cast,static_cast,dynamic_cast
- const_cast、static_cast、reinterpret_cast、dynamic_cast
- static_cast,const_cast,dynamic_cast,reinterpret_cast
- dynamic_cast;const_cast;static_cast;reinterpret_cast;
- dynamic_cast 、reinterpret_cast 、 static_cast 、 const_cast
- dynamic_cast,const_cast,static_cast,reinterpret_cast
- static_cast,dynamic_cast,reinterpret_cast,const_cast
- ireport导出pdf(二)
- Error:(15) No resource identifier found for attribute 'roundIcon' in package 'android'
- ios-autolayout添加约束的规则
- LINQ
- git代理设置方法解决
- static_cast,dynamic_cast,const_cast,reinterpret_cast使用总结
- hdu1722
- 第2条:遇到多个构造器参数时要考虑用构建器
- C++——NOIP2016提高组day1 t2——天天爱跑步
- 【“盛大游戏杯”第15届上海大学程序设计联赛 O】【爆搜 最短路】随机传送 需要补题解
- Android_Service与Activity的通信
- 剑指offer在线编程(二)
- Python生成汉字字库文字,以及转换为文字图片
- Camelyon Challenge: 癌症细胞区域检测竞赛