C++四种强制类型转换
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
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++四种强制类型转换相关推荐
- C++中的向上类型转换和向下类型转换+四种强制类型转换
转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...
- C++的四种强制类型转换
C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast 为什么使用C风格的强制 ...
- C++四种强制类型转换解析
C++的四种强制类型转换主要是static_cast<>,const_cast<>,reinterpret_cast,dynamic_cast<> 接下来依次介绍一 ...
- 逐梦C++之四:四种强制类型转换
1.总括四种强制类型转换 static_cast const_cast dynamic_cast reinterpret_cast 2.static_cast static_cast是最常用的强制类型 ...
- C++ :四种强制类型转换
文章目录 一.四种类型转换 1. static_cast<>() 2. const_cast<>() 3. reinterpret_cast<>() 4. dyna ...
- C++ 四种强制类型转换
C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型.其中数值型包括 整型与浮点型:字符型即为char. (1)将浮点型数据赋值给整型变量时,舍 ...
- C++ 类型转换 :C语言的类型转换、C++的四种强制类型转换、explicit
文章目录 C语言中的类型转换 隐式类型转换 显式类型转换 C++ 强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast explici ...
- C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit
文章目录 C语言类型转换 隐式类型转换 显式类型转换 C++ 强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 类的隐式类型转换 ...
- C++中四种强制类型转换的区别
使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast. 1.static_cast 用法:static_cast ...
最新文章
- 【干货】写给产品经理和设计师的用户体验说明书
- java中for循环的简化_Java中for语句的简化写法
- Java序列化报错serialVersionUID不一致
- Transformer-XL: Attentive Language ModelsBeyond a Fixed-Length Context 论文总结
- Oracle 12c 新特性:SQL Plan Directives与过量的动态采样解析
- java dbutil_Java:IO流,增删改查,配置文件,预处理后的DBUtils,含个人详细总结【诗书画唱】...
- 把阿拉伯数字1,2,3...转化成一,二,三
- 学习日记day29 平面设计 色彩
- 有哪些因素会淘宝的宝贝突然没有流量?
- MaxCompute创建TableStore外表
- 交叉熵损失函数权重计算
- scrum 和敏捷介绍(概念、流程、自己的理解)
- 发表一篇工科EI会议论文需要注意的几个点
- Node+Vue3.0+Mongodb实现完美解决高并发的购物平台管理系统
- deepin 下使用节能模式不降低屏幕亮度
- MIT_单变量微积分_18
- srsLTE:高度模块化的 3GPP LTE 开源库
- miui怎么用第三方图标包_快来领取你的图标包~
- SDUST 点在圆内吗?
- SharedObject对象聊天室
热门文章
- 子线程中更新UI线程的三个方法
- 有效需求分析的基本流程
- [转]“UPA 中国”北京行业聚会笔录
- python可以自动写文章吗_让python来告诉你神奇的操作,如何实现文章自动化
- mysql数据库version版本控制_MySQL数据库版本控制
- java resultset 映射到实例_[Java]ResultSet的用法与实例
- linux 修改jmeter内存溢出,jmeter本机内存溢出如何修改?
- css3点击会移动到点,CSS3过渡点击事件
- python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
- python使用多线程写生成器_Python学习——多线程,异步IO,生成器,协程