const_cast(链接)

用来去掉const或volatile属性

  volatile:

  • 用于并行设备的硬件寄存器(状态寄存器),
  • 中断服务子程序中会访问到的非自动变量,
  • 多线程中被几个任务共享的变量

一般用来将常量指针变为非常亮指针, 常量引用变为非常量引用, 常量对象变为非常量对象

static_cast(链接

强制类型转换:(不含类型转换的安全检查)

子类指针转换为父类指针,父类指针可以转换为子类指针(但是不安全)

用于:

  • 类中基类和派生类指针和引用的转换
  • 基本类型转换(相当于c语言中的类型转换)
  • 空指针转换为目标类型的空指针
  • 任何类型转换为void类型
  • 不可以去掉const volatile expression类型

reinterpret_cast

仅仅重新解释类型,但没有进行二进制的转换:
1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。
2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把
一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成
原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指
针。
3. 最普通的用途就是在函数指针类型之间进行转换。
4. 很难保证移植性。
例子:

  • int doSomething(){return 0;};
  • typedef void(*FuncPtr)();
  • //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 void
  • FuncPtr funcPtrArray[10];
  • //10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数
  • 的指针存入funcPtrArray数组:
  • funcPtrArray[0] = &doSomething;
  • // 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArray
  • funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
  • //不同函数指针类型之间进行转换

用于以二进制形式重新解释类型,但是没有进行二进制的类型转换

dynamic_cast

有条件转换,动态类型转换,运行时类型安全检查(转换失败返回
NULL):
1. 安全的父类和子类之间转换。
2. 必须要有虚函数。
3. 相同父类不同子类之间的交叉转换。但结果是NULL。
例子:

class BaseClass
{
public:
int m_iNum;
virtual void foo(){};
};

基类必须有虚函数。保持多态特性才能使用dynamic_cast

总结
去const属性用const_cast。
基本类型转换用static_cast。
多态类之间的类型转换用dynamic_cast。
不同类型的指针类型转换用reinterpret_cast

最新文章

  1. Windows 搭建jdk、Tomcat、eclipse以及SVN、maven插件开发环境
  2. Yii2中request的使用
  3. Data Binding和INotifyPropertyChanged是如何协调工作的?
  4. Android手机刷机失败的自救方法
  5. go json null字段的转换
  6. java.sql.SQLException: JZ00L
  7. 编写更加稳定/可读的javascript代码
  8. WPF学习之路(二) XAML
  9. Linux 信号详解二(信号分类,信号处理,kill)
  10. ZOJ 3790 Consecutive Blocks
  11. python多重继承:
  12. InfoSphere BigInsights 安装部署
  13. ubuntu14.04折腾迅雷xware
  14. eclipse添加xsd
  15. Linux系统编程(13)——Shell的基本语法
  16. Spark&amp;amp;Spark性能调优实战
  17. 第一百节,JavaScript表达式中的运算符
  18. 假如时光倒流,我会这样学习Java
  19. ansible批量管理
  20. Vue2全家桶之二:vue-router(路由)详细教程,看这个就够了

热门文章

  1. 领域模型/DDD领域驱动设计
  2. 【Docker学习之七】Docker图形化管理和监控
  3. readiness与liveness
  4. Git 初始仓库
  5. Access to XMLHttpRequest at &#39;http://127.0.0.1:8000/XXXXX&#39; from origin &#39;http://localhost
  6. JVM 配置常用参数和常用 GC 调优策略
  7. Connection to 天mysql failed. [08001] Could not create connection to database server. Attempted ,报错处理方法
  8. 【LEETCODE】70、字符匹配1023 Camelcase Matching
  9. python之Ai测试Applitools使用
  10. 关于使用KubeSphere中的docker配置Harbor仓库http访问docker login登陆报错的解决办法