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. Mysql 时间类型整理

    一.date_sub.SUBDATE.date_add select now(),  date_sub(now(),interval  1 minute),SUBDATE(now(),interval ...

  2. vue + element-ui Table的数据多选,多页选择数据回显,分页记录保存选中的数据。

    业务的需要:我要对与会人员勾选,记录所选的与会人员,并且点击到别的页面上时也要记录所勾选的.第一次尝试,每次点击下一页数据都会清空.然后我就去element ui官网查看了api.实现如下: 在tab ...

  3. numpy 小示例

    import numpy as np 生成 3*4 的由  0 组成的二维数组 >>> np.zeros((3,4)) array([[0., 0., 0., 0.], [0., 0 ...

  4. SharePoint Web应用程序管理-PowerShell

    1. 显示场中的Web应用程序 Get-SPWebApplication 2. 获取指定的Web应用程序 $webApp = Get-SPWebApplication -Identity " ...

  5. Linux中MySQL中文乱码问题

    一. 问题描述 登录后查看mysql默认编码: mysql> show variables like 'character%'; +--------------------------+---- ...

  6. MATLAB安装教程

    1.资源下载 下载官方安装包R2015b_win64.(文件太大,没上传资源) 下载破解文件包,解压其中的相应压缩包(一般是win64那个压缩包) 下载地址:链接:http://pan.baidu.c ...

  7. SVM实现分类识别及参数调优(一)

    前言 项目有一个模块需要将不同类别的图片进行分类,共有三个类别,使用SVM实现分类. 实现步骤: 1.创建训练样本库: 2.训练.测试SVM模型: 3.SVM的数据要求: 实现系统: windows_ ...

  8. PC端体验效果最佳epub阅读器——iRead爱读书

    官网:http://www.ireadhome.com/

  9. 51Nod 1058: N的阶乘的长度(斯特林公式)

    1058 N的阶乘的长度  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Inp ...

  10. L3-021 神坛 (30 分)

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...