原文:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html

C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:
TYPE b = (TYPE)a。
C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。

const_cast,字面上理解就是去const属性。
static_cast,命名上理解是静态类型转换。如int转换成char。
dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。
reinterpret_cast,仅仅重新解释类型,但没有进行二进制的转换。
4种类型转换的格式,如:TYPE B = static_cast(TYPE)(a)。

const_cast
去掉类型的const或volatile属性。

1 struct SA {2 int i;3 };4 const SA ra;5 //ra.i = 10; //直接修改const类型,编译错误6 SA &rb = const_cast<SA&>(ra);7 rb.i =10;

static_cast

类似于C风格的强制转换。无条件转换,静态类型转换。用于:
1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)
2. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
3. 把空指针转换成目标类型的空指针。
4. 把任何类型的表达式转换成void类型。
5. static_cast不能去掉类型的const、volitale属性(用const_cast)。

1 int n =6;2 double d = static_cast<double>(n); // 基本类型转换3 int*pn =&n;4 double*d = static_cast<double*>(&n) //无关类型指针转换,编译错误5 void*p = static_cast<void*>(pn); //任意类型转换成void类型

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

 1 class BaseClass { 2 public: 3 int m_iNum; 4 virtualvoid foo(){}; //基类必须有虚函数。保持多台特性才能使用dynamic_cast 5 }; 6  7 class DerivedClass: public BaseClass { 8 public: 9 char*m_szName[100];10 void bar(){};11 };12 13 BaseClass* pb =new DerivedClass();14 DerivedClass *pd1 = static_cast<DerivedClass *>(pb); //子类->父类,静态类型转换,正确但不推荐15 DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb); //子类->父类,动态类型转换,正确16 17 BaseClass* pb2 =new BaseClass();18 DerivedClass *pd21 = static_cast<DerivedClass *>(pb2); //父类->子类,静态类型转换,危险!访问子类m_szName成员越界19 DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2); //父类->子类,动态类型转换,安全的。结果是NULL

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

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

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

转载于:https://www.cnblogs.com/Leo-Forest/archive/2012/08/16/2642000.html

C++类型转换总结【转】相关推荐

  1. java基本类型转换,随记

    java基本类型转换: double double 转 long double random = Math.round(Math.random()*10000); long l = new Doubl ...

  2. Go 知识点(12) — 类型转换以三方库 cast

    类型转换在编程语言中是很常见的操作,在 Go 语言中其类型转换有下面一些注意点. 1. 整数类型之间的转换 对于整数类型转换,原则上目标类型的取值范围要包含被转换值,也就是说要转换类型的值取值范围要小 ...

  3. 数据类型转换pytorch

    du = torch.ones([2,2]) a = np.array([[1,2],[3,4]],dtype=np.float32) b = torch.from_numpy(a)#数据类型是不变的 ...

  4. tf.cast()数据类型转换

    tf.cast()函数的作用是执行 tensorflow 中张量数据类型转换,比如读入的图片如果是int8类型的,一般在要在训练前把图像的数据格式转换为float32. cast定义: cast(x, ...

  5. Java中如何实现Date与String之间的数据类型转换

    String 数据类型转换成 Date String inputDate = "2021-04-11";Date outputDate = null;SimpleDateForma ...

  6. Java基本数据之间的类型转换

    Java 数据类型及类型转换 基本数据类型:共八种: 复合类型:字符串(String),数组(array),类(Class),接口(Interface)等等: 其中个人常用的有:int,boolean ...

  7. 自动类型转换和强制类型转换

    自动类型转换: 在Java中,任何情况下,整数类型的字面值默认当成int类型处理 小容量可以自动转换成大容量,这种操作被称为自动类型转换 容量大小的定义: 容量大小不是指数据类型的字节数,而是指这个数 ...

  8. Java 数据类型转换

    学而时习之,温故而知新. 数据类型转换,先放一张图,了解数据类型 简单数据类型之间的转换又可以分为: 1 低级到高级的自动类型转换 2 级到低级的强制类型转换 3 包装类过渡类型转换. (有时候我们有 ...

  9. Java基础语法(一)注释,关键字,常量,变量,数据类型,标识符,数据类型转换...

    从今天开始,记录学习Java的过程.要学习Java首先得有环境,至于环境的安装我就不说了,百度有很多教程,比如:http://jingyan.baidu.com/article/20095761904 ...

  10. C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像

    搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大 ...

最新文章

  1. JavaScript引擎大战:Google提出StrongMode和SoundScript议案,增强V8性能
  2. Windows 8失败的5个原因
  3. 云原生全景图之五:应用程序定义和开发层
  4. flowable 表名sql mysql和oracle
  5. 05_Grafana的安装和Influxdb数据源配置
  6. Asp.net Web Api 路由 和 异常处理
  7. 最新Javascript 基础知识全总结(持续更新)
  8. API接口自动化测试框架搭建(二)-详细设计框架设计
  9. php怎么画五星红旗,PHP_php基于GD库画五星红旗的方法,本文实例讲述了php基于GD库画 - phpStudy...
  10. python暂停和恢复按钮,Python:如何暂停和恢复线程
  11. iOS App 签名的原理
  12. JAVASE第5天笔记
  13. 统计学 计算机论文发表,数学科学学院博士生史册在统计学顶级期刊 《Annals of Statistics》上发表论文...
  14. 我的EeePC 700,你快回来啊
  15. python批量自动化工作
  16. matlab练习程序(随机粒子切换特效)
  17. Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表
  18. 排查计算机安全隐患,计算机安全隐患检查
  19. 卫星导航模拟器GSS7000测试NTRIP RTK--以Ublox F9P 为例.rtklib原始观测量解算固定解FIX
  20. 诺基亚(Nokia)推出了其近20年来的首款电脑产品

热门文章

  1. 工厂设计模式——简单工厂模式——未完待续
  2. mysql常用语句整理
  3. rat/rats--用有理数形式表示矩阵
  4. getAffineTransform函数
  5. linux双小于命令,Linux文本比较命令:diff
  6. Ubuntu下python升级pip(ImportError: cannot import name 'main')
  7. vscode快捷操作
  8. Visdom数据可视化工具绘制Loss曲线
  9. 1.3.2 向量化实现浅层神经网络
  10. 二维矩阵与二维矩阵之间的卷积