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的作用与区别的更多相关文章

  1. linux中bin与sbin目录的作用及区别介绍

    linux中bin与sbin目录的作用及区别介绍 本文介绍下,linux中的二个主要目录:bin与sbin,它们的作用与区别,学习linux的朋友可以参考下 在linux系统中,有两个重要的目录:bi ...

  2. spring中的BeanFactory与ApplicationContext的作用和区别?

    BeanFactory类关系继承图 1. BeanFactory类结构体系: BeanFactory接口及其子类定义了Spring IoC容器体系结构,由于BeanFactory体系非常的庞大和复杂, ...

  3. 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?

    [QQ群: 189191838,对算法和C++感兴趣可以进来]       开篇立意: C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...

  4. reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析

    reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...

  5. C#中in,out,ref,params的作用和区别

    ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键 ...

  6. [转]web.xml中servlet ,filter ,listener ,interceptor的作用与区别

    原文链接:https://blog.csdn.net/netdevgirl/article/details/51483273 一.概念: 1.servlet:servlet是一种运行服务器端的java ...

  7. spring中的BeanFactory与ApplicationContext的作用和区别

    BeanFactory 和ApplicationContext Bean 工厂(com.springframework.beans.factory.BeanFactory)是Spring 框架最核心的 ...

  8. Class中的getClasses与getDeclaredClasses方法作用于区别

    getClasses和getDeclaredClasses的区别: getClasses得到该类及其父类所有的public的内部类. getDeclaredClasses得到该类所有的内部类,除去父类 ...

  9. C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别

    C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...

随机推荐

  1. 2.1 C++类的定义和声明

    参考:http://www.weixueyuan.net/view/6333.html 总结: 类相当于一个新的数据类型,定义类对象时,除了能定义单个变量以外,用类定义一个数组或者指针都是可行的. 在 ...

  2. Translating Skills 英汉语序的对比及翻译

    本文记录于培训课程. ----------------------------------------- word order:Refers to the sorting in language un ...

  3. php 函数2

  4. UIWebView和UIWebViewDelegate的基本用法 (转)

    一.UIWebView主要有三种方法实现页面的装载,分别是: 1. (void)loadRequest:(NSURLRequest *)request;  (直接装载URL) 2. (void)loa ...

  5. UI基础:UI程序执行顺序(UIApplicationMain()函数),自定义视图 分类: iOS学习-UI 2015-07-02 22:09 68人阅读 评论(0) 收藏

    UI程序的一般执行顺序: 先进入main里面,执行函数UIApplicationMain(),通过该函数创建应用程序对象和指定其代理并实现监听,当执行函数UIApplicationMain()时还会做 ...

  6. Linux文件IO与通用块层的请求合并

    本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号“Linux阅码场” 请求合并就是将进程内或者进程间产生的在物理地址上连续的多个IO ...

  7. HihoCoder - 1867: GCD (莫比乌斯容斥)

    Sample Input 6 1 6 2 5 3 4 Sample Output 10 You are given a {1, 2, ..., n}-permutation a[1], a[2], . ...

  8. 大家一起做训练 第一场 A Next Test

    题目来源:CodeForce #27 A 题目的意思简而言之就是要你输出一个没有出现过的最小的正整数. 题意如此简单明了,做法也很明了. 直接读入所有的数,然后排个序,设置个变量从1开始,出现过+1, ...

  9. CTF-练习平台-Misc之 Telent

    三.Telent 下载下来文件,解压压缩包,用记事本打开pcap文件,发现flag

  10. POJ1733 Parity game

    题意 Language:Default Parity game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13833 Acc ...