关于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中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
随机推荐
- Python删除文件,空文件夹,非空文件夹
首先,在Python中文件路径是这种格式: file_path1 = r'F:\test\1' 删除文件,命令 os.remove(file_path1) 删除空文件夹,命令 os.rmdir(fil ...
- Math 类
Math 类 java.lang.Object java.lang.Math 方法签名 public final class Math extends Object public static fin ...
- SQL Server 2019 新版本
2019 年 11 月 4 日,微软在美国奥兰多举办的 Ignite 大会上发布了关系型数据库 SQL Server 的新版本.与之前版本相比,新版本的 SQL Server 2019 具备以下重要功 ...
- day14——装饰器
day14 装饰器 装饰器本质就是闭包 开放封闭原则: 扩展是开放的(增加新功能),对源码是封闭的(修改已经实现的功能) 装饰器:用来装饰的工具 作用:在不改变源代码及调用方式的基础下额外增加新的功能 ...
- Python之路【第三十一篇】:django ajax
Ajax 文件夹为Ajaxdemo 向服务器发送请求的途径: 1.浏览器地址栏,默认get请求: 2.form表单: get请求 post请求 3.a标签,超链接(get请求) 4.Ajax请求 特点 ...
- html 打开新页面
设置 target 页面 这样会点击一次就产生一个页面 页面 填任意名称,多个点击只产生于一个页面
- SQL注入获取Sa账号密码
漏洞位置:http://168.1.1.81/Information/Search?Keyword=1111 漏洞利用: MSSQL 2000 http://168.1.1.81/Informatio ...
- Laravel 5.5 发布,ThinkSNS+ 升级及状况分享
升级场景 ThinkSNS+ 一直依赖,都是保留 Laravel 的 commit 记录的前提下,进行开发,为了追随 Laravel 的升级,我们在本地的仓库中新建了一个分支,如果 laravel 更 ...
- MySQL路线
一 数据库简介与安装 二 库操作 三 表操作 四 数据操作 五 索引原理与慢查询优化 六 数据备份与慢查询优化 七 视图.触发器.事务.存储过程.函数
- 学习笔记之Vim
Vim (text editor) - Wikipedia https://en.wikipedia.org/wiki/Vim_(text_editor) Vim (/vɪm/;[4] a contr ...