C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)
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));
}
C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)的更多相关文章
- C++中四种转换类型的区别
一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...
- 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?
[QQ群: 189191838,对算法和C++感兴趣可以进来] 开篇立意: C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...
- C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)
一.static_cast static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,如: #include <iostream> #include <cs ...
- 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...
- C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用
1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2. ...
- C++中的四种强制类型转换符详解
阅读目录 C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非con ...
- C++四种强制类型转换关键字
C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast ...
- C++四种强制转换
C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast 为什么使用C风格的强制 ...
- C++ 四种类型转换
在写代码中经常会有很多的隐式类型转换或显式类型转换. 对于隐式的类型转换主要是放生在赋值的时候,讲变量赋值给不同类型的变量的时候就会发生类型转换,如果是宽化转换(即从占字节少的类型向占字节多的类型转换 ...
随机推荐
- 关于eclipse 项目导入不了 maven依赖的解决办法
1.首先确定你的项目是maven 项目 ,如果不是:项目右键Configure -->Convert to maven project. 2.在SVN导出的Maven项目,或以前不是用Maven ...
- 数据预处理 | 使用 OneHotEncoder 及 get_dummuies 将分类型数据转变成哑变量矩阵
[分类数据的处理] 问题: 在数据建模过程中,很多算法或算法实现包无法直接处理非数值型的变量,如 KMeans 算法基于距离的相似度计算,而字符串则无法直接计算距离 如: 性别中的男和女 [0,1] ...
- 数据预处理 | 通过 Z-Score 方法判断异常值
判断异常值方法:Z-Score 计算公式 Z = (X-μ)/σ 其中μ为总体平均值,X-μ为离均差,σ表示标准差.z的绝对值表示在标准差范围内的原始分数与总体均值之间的距离.当原始分数低于平均值时, ...
- unrecognized import path "golang.org/x/*"的解决办法
由于国内网络原因,因此访问https://golang.org/网站会被限制.所以在go get下载其他第三方包的时候,如果这个第三方包又引用了https://golang.org/x/下的包,通常会 ...
- 菜得一P!
什么时候才能改变粗心大意的坏毛病!太吃亏了...
- Linux下用Bash语言实现输出最大值的功能
题目链接: 题目描述 编写一个程序,输入a.b.c三个值,输出其中最大值. 输入 一行数组,分别为a b c 输出 a b c其中最大的数 样例输入 10 20 30 样例输出 30 复习下Linux ...
- gazebo仿真踩坑--rviz中设定机器人的目标位置,move_base后台日志报错
启动仿真环境及各种节点(amcl,move_base,map_server)后,在rviz中设定机器人的目标位置,后台日志报错 [ INFO] [1571974242.864525935, 40.51 ...
- Redis 数据总结 (2.命令实现逻辑)
1.通过合理的Redis数据分布,实现逻辑的简化,即将部分逻辑纳入redis 连个sort表的合并,相关的资料见 http://www.redis.net.cn/order/3613.html ZIN ...
- 为什么 K8s 在阿里能成功(转)
为什么 K8s 在阿里能成功?| 问底中国 IT 技术演进 作者:曾凡松 阿里云云原生应用平台高级技术专家张振 阿里云云原生应用平台高级技术专家 导读:本文描述了阿里巴巴在容器管理领域的技术演进历 ...
- python接口自动化之发送post(四)
1.ssl问题 目前很多的请求使用的都是较为安全的https请求,https请求相对于http安全级别更高,需要验证ssl证书 写代码的时候有两种可以忽略ssl验证的方法 (1)import urll ...