C++中reinterpret_cast、const_cast、static_cast、dynamic_cast的作用与区别
1.reinterpret_cast
作用及原理:将一个类型的指针,转换为另一个类型的指针,这种转换不用修改指针变量值数据存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可以,当然他也可以将指针转换成整型值,但不能做非指针类型转换
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
//基本类型指针变换
double d=9.3;
double* pd=&d;
int *pi=reinterpret_cast<int *>(pd); //不相关的类的指针的类型转换
class A{};
class B{};
A* pa=new A;
B* pb=reinterpret_cast<B*>(pa);//相当于隐式转换B* pb=(B*)pa; //指针转换成整数
long j=reinterpret_cast<long>(pi);//相当于隐式转换long j=(long)pi; return ;
}
2.const_cast
作用及原理:用于去除指针变量的常量属性,将它转换为一个对应的指针类型的普通变量,当然,也可以将一个非常量的指针变量转换为一个常指针变量。这种转换在编译期间
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
const int* pci=;
int* pj=const_cast<int*>(pci);//相当于隐式转换int* pj=(int*)pci; return ;
}
3.static_cast
作用及原理:主要用于基本类型之间和具有继承关系的类型之间的转换
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
//基本类型转换
int i=;
double d=static_cast<double>(i);//相当于隐式转换double d=(double) i;
int j=static_cast<int>(d);//相当于隐式转换int j=(int)d; //转换继承类的对象
class Base{};
class Derived:public Base{};
Derived D;
Base b=static_cast<Base>(D);//将子类对象赋值给父类对象 return ;
}
4.dynamic_cast
作用及其原理:dynamic_cast转换是动态转换,这种转换是在运行时进行转换分析,而不是在编译时期进行,这是区别以上三种转化的一处。dynamic_cast只能在继承类对象的指针之间或引用之间进行转换,进行转换时,会根据当前运行对象的运行类型信息(RTTI),判断类型对象之间的转换是否合法。dynamic_cast的指针转换失败,可通过是否为null指针来检测
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
class Base{};
class Derived:public Base{};
//子类指针转换为父类指针
Derived* pd=new Derived;
Base* pc=dynamic_cast<Base*>(pd); if(!pc)
cout<<"转换失败"<<endl;
else
cout<<"转换成功"<<endl; //没有继承关系,但被转换的类有虚函数
class A{virtual ~A(){}};//有虚函数
class B{}; A* pa=new A;
B* pb=dynamic_cast<B*>(pa); if(!pb)
cout<<"转换失败"<<endl;
else
cout<<"转换成功"<<endl; return ;
}
结果如下:

没有继承关系的类之间转换,如果被转换的类有虚函数,编译器会通过,但是转换会失败
总结:
reinterpret_cast适用于指针转换为另一种指针
const_cast适用于常指针变量,可以使常指针变量变为非常指针变量
static_cast主要用于基本类型转换和拥有继承关系变量之间的转换
dynamic_cast只能在继承对象的指针之间或引用之间进行类型转换
注意:需要添加头文件#include<typeinfo>
C++中reinterpret_cast、const_cast、static_cast、dynamic_cast的作用与区别的更多相关文章
- linux中bin与sbin目录的作用及区别介绍
linux中bin与sbin目录的作用及区别介绍 本文介绍下,linux中的二个主要目录:bin与sbin,它们的作用与区别,学习linux的朋友可以参考下 在linux系统中,有两个重要的目录:bi ...
- spring中的BeanFactory与ApplicationContext的作用和区别?
BeanFactory类关系继承图 1. BeanFactory类结构体系: BeanFactory接口及其子类定义了Spring IoC容器体系结构,由于BeanFactory体系非常的庞大和复杂, ...
- 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?
[QQ群: 189191838,对算法和C++感兴趣可以进来] 开篇立意: C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...
- reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析
reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...
- C#中in,out,ref,params的作用和区别
ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键 ...
- [转]web.xml中servlet ,filter ,listener ,interceptor的作用与区别
原文链接:https://blog.csdn.net/netdevgirl/article/details/51483273 一.概念: 1.servlet:servlet是一种运行服务器端的java ...
- spring中的BeanFactory与ApplicationContext的作用和区别
BeanFactory 和ApplicationContext Bean 工厂(com.springframework.beans.factory.BeanFactory)是Spring 框架最核心的 ...
- Class中的getClasses与getDeclaredClasses方法作用于区别
getClasses和getDeclaredClasses的区别: getClasses得到该类及其父类所有的public的内部类. getDeclaredClasses得到该类所有的内部类,除去父类 ...
- C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别
C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...
随机推荐
- Java——线程同步
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- 《Python》 字典
一.字典 字典是Python的基础数据类型之一: 字典可以存储大量的数据,关系型数据: 同样他也是Python中唯一的映射类数据类型. 数据类型的分类: 可变的(不可哈希的)数据类型:list,dic ...
- 玩转X-CTR100 l STM32F4 l TB6612直流电机调速控制
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的直流调速电机控制,X ...
- Vue.js 源码学习笔记 -- 分析前准备1 -- vue三大利器
主体 实例方法归类: 先看个作者推荐, 清晰易懂的 23232 简易编译器 重点: 最简单的订阅者模式 // Observer class Observer { constructor (d ...
- C++中特殊的宏定义
常规用法不再介绍,做如下几点说明和介绍 1. 带参数的宏只完成简单字符替换,之前不做计算实参的工作,如下 #define SUM(x,y) x+yint a=3,b=2,c=1;int s;s=SUM ...
- 浏览器兼容性工具 Spoon Browser Sandbox
1.Spoon Browser Sandbox 勺浏览器沙箱 主流浏览器多(IE.Chrome.FireFox.Safari.Opera),浏览器又有很多版本:保证网页在主流浏览器中很好的显示,不可能 ...
- 按顺序动态加载js, 可控版本, 有回调
load和onScriptLoad方法是直接从layerui的源码里粘贴出来修改了一下用的, 来源: https://gitee.com/sentsin/layui/blob/master/src/l ...
- PLsql登录数据库提示密码即将过期-
小哥询问,PL*SQL用户登录后弹出警告:咋整? ORA-28002:the password will expire within 7 days密码在7天内将到期 do you wish to ch ...
- 【计算机视觉】人脸检测模型的评估方法-linux
前言 人脸检测标准库FDDB详细介绍了数据库和使用方法.对于训练的模型,如何评估模型的效果呢,本文对此进行介绍.说实话,参考了很多博客,但是感觉都不是很明白(当然本文也会有瑕疵),故在此记录! 测试环 ...