关于c++中的类型转换符
const_cast(链接)
用来去掉const或volatile属性
volatile:
- 用于并行设备的硬件寄存器(状态寄存器),
- 中断服务子程序中会访问到的非自动变量,
- 多线程中被几个任务共享的变量
一般用来将常量指针变为非常亮指针, 常量引用变为非常量引用, 常量对象变为非常量对象
static_cast(链接)
强制类型转换:(不含类型转换的安全检查)
子类指针转换为父类指针,父类指针可以转换为子类指针(但是不安全)
用于:
- 类中基类和派生类指针和引用的转换
- 基本类型转换(相当于c语言中的类型转换)
- 空指针转换为目标类型的空指针
- 任何类型转换为void类型
- 不可以去掉const volatile expression类型
reinterpret_cast
仅仅重新解释类型,但没有进行二进制的转换:
1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。
2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把
一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成
原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指
针。
3. 最普通的用途就是在函数指针类型之间进行转换。
4. 很难保证移植性。
例子:
- int doSomething(){return 0;};
- typedef void(*FuncPtr)();
- //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 void
- FuncPtr funcPtrArray[10];
- //10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数
- 的指针存入funcPtrArray数组:
- funcPtrArray[0] = &doSomething;
- // 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArray
- funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
- //不同函数指针类型之间进行转换
用于以二进制形式重新解释类型,但是没有进行二进制的类型转换
dynamic_cast
有条件转换,动态类型转换,运行时类型安全检查(转换失败返回
NULL):
1. 安全的父类和子类之间转换。
2. 必须要有虚函数。
3. 相同父类不同子类之间的交叉转换。但结果是NULL。
例子:
class BaseClass
{
public:
int m_iNum;
virtual void foo(){};
};
基类必须有虚函数。保持多态特性才能使用dynamic_cast
总结
去const属性用const_cast。
基本类型转换用static_cast。
多态类之间的类型转换用dynamic_cast。
不同类型的指针类型转换用reinterpret_cast
关于c++中的类型转换符的更多相关文章
- C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别
C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...
- [转]C++中四种类型转换符的总结
C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression) reinterpret_cast操 ...
- C++中的四种强制类型转换符详解
阅读目录 C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非con ...
- C语言中强制类型转换总结
C语言中强制类型转换总结 ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围 ...
- JS中数据类型转换
JS中数据类型转换汇总 JS中的数据类型分为 [基本数据类型] 数字 number 字符串 string 布尔 boolean 空 null 未定义 undefined [引用数据类型] 对象 obj ...
- java中的修饰符和基本数据类型
1.java中的修饰符 java中的修饰符主要是用来对类资源进行一个权限控制,上面表格表现的很清晰,无需多言. 2.java中的基本数据类型 java中的数据类型分为引用类型和基本类型.基本数据类型有 ...
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- JavaScript中数据类型转换总结
JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...
- java中强制类型转换
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
随机推荐
- 解决chrome浏览器插件开发者模式每次启动要确认弹出框的问题
在日常工作中,我们经常会用到一些浏览器插件,有些插件因为没上架到浏览器的应用商店,只能以开发者模式运行,但是chrome浏览器出了限制,每次重新启动浏览器的时候,就会弹出该插件是否要禁止运行的对话框, ...
- Android组件化aar躺坑记:ButterKnife 报 元素值必须为常量表达式错误
背景: 项目有需求,将自己写的模块作为一个module给到大项目使用,所以准备把自己的项目打包成aar包. 一.如何将独立项目打包成aar: 1.修改module下的application 为libr ...
- python 递归\for循环_斐波那契数列
# 递归 def myAdd(a, b): c = a + b print(c) if c > 100: return return myAdd(a + 1, c) #最大递归深度是1000 m ...
- KEPServerEX 6 配置连接 Allen-Bradley MicroLogix 1400
=============================================== 2019/7/28_第1次修改 ccb_warlock == ...
- Json schema前奏 关于JSON
目录 1. 何为 JSON 2. JSON 基本语法 3. JSON值的类型 4. 与XML比较 5. 辅助工具 1. 何为 JSON JSON( JavaScript Object Notation ...
- Java字节码扩展
异常表 代码一: public class Test03 { public void test() { try { InputStream is = new FileInputStream(" ...
- 定时任务-Windows任务
定时任务-Windows任务 什么是windows任务 windows系统自带一个任务管理组件.可以执行自己写的程序,发送电子邮件(需要邮件服务器),显示消息(就是桌面弹出一个窗口).用的最多的就 ...
- java基础 String
标准格式:数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};省略格式:数据类型[] 数组名称 = {元素1,元素2,...}; Scanner类实现的功能,可以实现键盘输入 ...
- java之mybatis之字段映射及多对一
1. 数据库中表的列名和实体类的属性名称不一致. 可以使用 resultMap来解决. <select id="findAll" resultMap="UserMa ...
- docker安装mysql笔记
首先 查找镜像 docker search mysql 拉取镜像 : docker pull mysql 拉取成功后,查看本地镜像: docker images 可以看到本地有两个镜像(redis是我 ...