提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

C++四种强制类型转换

  • 一、static_cast
  • 二、dynamic_cast
  • 三、const_cast
  • 四、reinterpret_cast

一、static_cast

static_cast主要用于一种类型转化成另外一种类型

主要用于:
1.用于类层次结构中基类和派生类之间指针或引用的转换
上行转化(把派生类的指针或引用转换成基类表示)是安全的
下行转化(把基类的指针或引用转换成派生类表示)不安全,并不像dynamic_cast有检测
2.用于基本类型的转化,例如int转化double
3.把空指针转化成目标类型空指针
4.把任意类型转化成void类型

二、dynamic_cast

首先dynamic_cast与其他三种强制类型转换不同的点在与,它是在运行时类型检查,而其他三种是在编译时处理的,其次dynamic_cast不能用与基本类型数据的强制转换

主要用于:
1.用于类层次结构中基类和派生类之间指针或引用的转换,与static_cast不同的是dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。它会有一个安全措施,确保了安全性
2.使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
PS: 基类中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

三、const_cast

弥补了static_cast无法转换const/volitale的不足,将expression的const/volitale属性移除,仅限于底层const属性.
需要注意的是:const_cast不是去除常量的const属性,而是去除指向常量的指针或引用的属性
举个例子:

int main()
{const int a = 7;const int* p = &a;int* q = const_cast<int*>(p);*q = 20; //通过q写值是未定义的行为printf("q=%d\n", *q);printf("a=%d\n", a);cout << "q=" << q << endl;cout << "a=" << &a << endl;
}

a是常量,所以无法改变它的值,const_cast只是改变指向常量指针的常量性,通过地址改变其值


但是出现以下的状况,q指向地址和a的地址相同,*q改变了a的值,但是显示出来却是没改变,一个猜想是可能是编译器的问题,本质上是已经改变了,我们来通过调试来看一看。

通过调试我们发现确实是这样,内存以及改了,但是显示出来还是没改的样子

四、reinterpret_cast

reinterpret_cast 允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。
PS:
1.reinterpret_cast 运算符可用于 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,这本身并不安全,但可以通过编译
2. reinterpret_cast 的本质作用是重新定义内存数据的解释方式,而不进行任何二进制转换

C++四种强制类型转换相关推荐

  1. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  2. C++的四种强制类型转换

    C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast 为什么使用C风格的强制 ...

  3. C++四种强制类型转换解析

    C++的四种强制类型转换主要是static_cast<>,const_cast<>,reinterpret_cast,dynamic_cast<> 接下来依次介绍一 ...

  4. 逐梦C++之四:四种强制类型转换

    1.总括四种强制类型转换 static_cast const_cast dynamic_cast reinterpret_cast 2.static_cast static_cast是最常用的强制类型 ...

  5. C++ :四种强制类型转换

    文章目录 一.四种类型转换 1. static_cast<>() 2. const_cast<>() 3. reinterpret_cast<>() 4. dyna ...

  6. C++ 四种强制类型转换

    C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型.其中数值型包括 整型与浮点型:字符型即为char. (1)将浮点型数据赋值给整型变量时,舍 ...

  7. C++ 类型转换 :C语言的类型转换、C++的四种强制类型转换、explicit

    文章目录 C语言中的类型转换 隐式类型转换 显式类型转换 C++ 强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast explici ...

  8. C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit

    文章目录 C语言类型转换 隐式类型转换 显式类型转换 C++ 强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 类的隐式类型转换 ...

  9. C++中四种强制类型转换的区别

    使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast. 1.static_cast     用法:static_cast ...

最新文章

  1. 【干货】写给产品经理和设计师的用户体验说明书
  2. java中for循环的简化_Java中for语句的简化写法
  3. Java序列化报错serialVersionUID不一致
  4. Transformer-XL: Attentive Language ModelsBeyond a Fixed-Length Context 论文总结
  5. Oracle 12c 新特性:SQL Plan Directives与过量的动态采样解析
  6. java dbutil_Java:IO流,增删改查,配置文件,预处理后的DBUtils,含个人详细总结【诗书画唱】...
  7. 把阿拉伯数字1,2,3...转化成一,二,三
  8. 学习日记day29 平面设计 色彩
  9. 有哪些因素会淘宝的宝贝突然没有流量?
  10. MaxCompute创建TableStore外表
  11. 交叉熵损失函数权重计算
  12. scrum 和敏捷介绍(概念、流程、自己的理解)
  13. 发表一篇工科EI会议论文需要注意的几个点
  14. Node+Vue3.0+Mongodb实现完美解决高并发的购物平台管理系统
  15. deepin 下使用节能模式不降低屏幕亮度
  16. MIT_单变量微积分_18
  17. srsLTE:高度模块化的 3GPP LTE 开源库
  18. miui怎么用第三方图标包_快来领取你的图标包~
  19. SDUST 点在圆内吗?
  20. SharedObject对象聊天室

热门文章

  1. 子线程中更新UI线程的三个方法
  2. 有效需求分析的基本流程
  3. [转]“UPA 中国”北京行业聚会笔录
  4. python可以自动写文章吗_让python来告诉你神奇的操作,如何实现文章自动化
  5. mysql数据库version版本控制_MySQL数据库版本控制
  6. java resultset 映射到实例_[Java]ResultSet的用法与实例
  7. linux 修改jmeter内存溢出,jmeter本机内存溢出如何修改?
  8. css3点击会移动到点,CSS3过渡点击事件
  9. python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
  10. python使用多线程写生成器_Python学习——多线程,异步IO,生成器,协程