reinterpret_cast 和 static_cast 的区别
安全性:
static_cast
是一个安全的类型转换,它只能转换具有继承关系或密切相关的类型,并且在编译时进行类型检查。
reinterpret_cast
是一个不安全的类型转换,它可以将任何类型的指针转换为任何其他类型的指针,而无需考虑类型安全性。
用途:
static_cast
用于转换具有继承关系或密切相关的类型,例如基类和派生类、整数类型和浮点类等。
reinterpret_cast
用于转换不相关的类型,例如指针类型和整数类型、结构体和联合体等。
使用场景
static_cast
- 从基类转换为派生类
- 从派生类转换为基类
- 从整数类型转换为浮点类型
- 从浮点类型转换为整数类型
- 从枚举类型转换为整数类型
reinterpret_cast
- 将指针类型转换为整数类型
- 将整数类型转换为指针类型
- 将结构体转换为联合体
- 将联合体转换为结构体
- 将函数指针转换为 void* 类型
- 将 void* 类型转换为函数指针
示例
static_cast
class Base {
public:
virtual void print() { std::cout << "Base" << std::endl; }
}; class Derived : public Base {
public:
void print() override { std::cout << "Derived" << std::endl; }
}; int main() {
Base* base = new Derived();
Derived* derived = static_cast<Derived*>(base); // 安全的类型转换
derived->print(); // 输出:Derived
return 0;
}
reinterpret_cast
int* ptr = new int(10);
void* voidPtr = reinterpret_cast<void*>(ptr); // 不安全的类型转换
int* newPtr = reinterpret_cast<int*>(voidPtr); // 不安全的类型转换
std::cout << *newPtr << std::endl; // 输出:10
需要注意的是,在使用 reinterpret_cast
时需要格外小心,因为它可能会导致未定义的行为或程序崩溃,如果转换的类型不兼容!
reinterpret_cast 和 static_cast 的区别的更多相关文章
- c++ dynamic_cast 和 static_cast 的区别
今天在看王道宝典的时候看到dynamic_cast ,一直都没用过,也不了解,今天来总结一下. dynamic_cast 和 static_cast 都可以用来强制转换指针类型,但不同的是dynami ...
- C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别
C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...
- reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析
reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...
- c++类的内存布局
问题: 考察了reinterpret_cast和static_cast的区别.顺道发现了一个可以查看c++内存布局的工具(在VS中). 结果: 前两个输出的地址形同,后一个不同. class A{in ...
- C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式.笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提 ...
- static_cast,const_cast,dynamic_cast,reinterpret_cast
除非必要,尽量不要对变量进行强制转换.这是因为强制转换是存在风险的,但实际上在某种情况下,转型是必需的. 旧式C转型方式为(type)expression,即由一对小括号加上一个对象名称组成,而这种语 ...
- [C++]const_cast,dynamic_cast,reinterpret_cast,static_cast转型
C++四种新式转型: const_cast(expression) dynamic_cast(expression) reinterpret_cast(expression) static_cast( ...
- reinterpret_cast and const_cast
reinterpret_cast reinterpret意为“重新解释” reinterpret_cast是C++中与C风格类型转换最接近的类型转换运算符.它让程序员能够将一种对象类型转换为另一种,不 ...
- C++中四种转换类型的区别
一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...
- 《C++必知必会》学习笔记
转载:http://dsqiu.iteye.com/blog/1734640 条款一 数据抽象 抽象数据设计遵循步骤:(1)为类型取一个描述性的名字.(2)列出类型所能执行的操作,不要忘了初始化(构造 ...
随机推荐
- Java设计模式-桥接模式Bridge
传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机.关机.上网,打电话等),如图: 类图 问题 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类, ...
- Java使用ConcurrentHashMap实现简单的内存式缓存
需求说明: 实际项目中我打算把用户和组织信息放到缓存中,基于此提出以下几点需求: 1.数据存储在内存中: 2.允许以键值对的方式存储对象类数据并带有过期策略: 3.不限制内存使用,但cache也不能给 ...
- Docker实践之05-限制Docker容器运行资源
Docker容器在默认情况下会使用宿主机的所有CPU和内存资源,为了明确限制每一个Docker容器的运行资源,需按如下操作进行设置. 首先,执行:sudo docker info,如果提示:" ...
- java基础字符串---02
String 概述 String类在java.lang包下,所以使用的时候不需要导包 String类代表字符串,java程序中的所有字符串文字(例如"abc")都被实现为此类的实例 ...
- 有了这份Java面试中的葵花宝典,让你面试起飞!!!
HashMap面试题 HashMap与HashTable的区别 1.HashMap线程不安全 HashTable 线程是安全的采用synchronized 2.HashMap允许存放key 为null ...
- Html飞机大战(十五): 上线
好家伙, 我的飞机大战部署上线了 胖虎的飞机大战 感兴趣的可以去玩一下 (怕有人接受不了这个背景,我还贴心的准备切换背景按钮,然而这并没有什么用) 现在,我们停下脚步,重新审视这个游戏 ...
- [C++逆向] 8 数组和指针的寻址
目录 数组在函数中 字符串 数组作为参数 下标寻址和指针寻址 多维数组 存放指针类型数据的数组 指向数组的指针变量 函数指针 数组是相同类型数据的集合,以先行方式连续储存在内冲中 而指针只是一个保存地 ...
- 为什么带NOLOCK的查询语句还会造成阻塞
背景 客户反映HIS数据库在11点出现了长时间的阻塞,直到手动KILL掉阻塞的源头.请我们协助分析原因,最终定位到.NET程序中使用的SqlDataReader未正常关闭导致. 现象 登录SQL专家云 ...
- Java 常用类 String类与其他结构之间的转换-----String 与 char[]之间的转换
1 /* 2 String 与 char[]之间的转换 3 4 String----> char[]:调用String的toCharArray() 5 char[] ---->String ...
- 【规范】看看人家Git提交描述,那叫一个规矩
前言 缘由 没想到玩了多年git,竟然还有提交描述规范 事情起因: 在工作迭代过程中,偶然发现同组小帅哥Git提交描述总是和自己的不大一样,秉承好奇至上的我特意去研究了下.竟然发现提交了这么多年的Gi ...