C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)
2024-10-08 10:44:46
static_cast
相当于C语言中的强制转换:(类型)表达式或类型(表达式),用于各种隐式转换
非const转const、void*转指针、int和char相互转换
用于基类和子类之间的指针和引用转换,非指针直接报错
向上转化是安全的,如果向下转能(指针或引用)成功但是不安全,结果未知;
dynamic_cast
用于动态类型转换。只能用于含有虚函数的类,必须用在多态体系种,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
如果没有virtual方法进行下行转换(指针或引用)会直接报错
const_cast
常量指针被转化成非常量的指针,并且仍然指向原来的对象;
常量引用被转换成非常量的引用,并且仍然指向原来的对象;
const_cast一般用于修改底指针。如const char *p形式。
const int a=10;
int *p=const_cast<int*>(&a); //p和a指向同一块内存地址
*p = 100; //修改*p,但a=10,*p=100
reinterpret_cast
(重解释转换)几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;随意的转换编译都会通过,但是不安全的转换运行时会异常
错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。
reinterpret_cast不能转换掉表达式的const
可以用在将void*转换为int类型
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}
最新文章
- MyEclipse 2014跟2015破解
- C语言程序设计第一次作业
- position置顶或某固定位置 兼容ie6ie7
- .NET Core应用程序的2种部署方式
- ~~圣诞节到啦, canvas雪花效果, 漂亮到简直没天理啊~~
- python_Day_02[数组、列表、元组之篇]
- MVC ActionResult -- JavaScriptResult,JsonResult
- shell自定义函数
- zz存储系统中缓存的三种类型
- RMQ——窗口题解
- NET基础课--Linq第一讲
- 实现android里面WebView显示内容
- Jenkins系列——使用checkstyle进行代码规范检查【升级版】
- IntelliJ IDEA 创建 Java包
- C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。
- JavaScript 常用内置对象(字符串属性、Math对象、Array数组对象)
- (PMP)解题技巧和典型题目分析(0903-2班)
- java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie解决方法
- SpringSecurity-FilterSecurityInterceptor的作用
- C#中Convert.ToInt32、int.TryParse、(int)和int.Parse四者的区别