安全性:

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 的区别的更多相关文章

  1. c++ dynamic_cast 和 static_cast 的区别

    今天在看王道宝典的时候看到dynamic_cast ,一直都没用过,也不了解,今天来总结一下. dynamic_cast 和 static_cast 都可以用来强制转换指针类型,但不同的是dynami ...

  2. C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别

    C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...

  3. reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析

    reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...

  4. c++类的内存布局

    问题: 考察了reinterpret_cast和static_cast的区别.顺道发现了一个可以查看c++内存布局的工具(在VS中). 结果: 前两个输出的地址形同,后一个不同. class A{in ...

  5. C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)

    C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式.笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提 ...

  6. static_cast,const_cast,dynamic_cast,reinterpret_cast

    除非必要,尽量不要对变量进行强制转换.这是因为强制转换是存在风险的,但实际上在某种情况下,转型是必需的. 旧式C转型方式为(type)expression,即由一对小括号加上一个对象名称组成,而这种语 ...

  7. [C++]const_cast,dynamic_cast,reinterpret_cast,static_cast转型

    C++四种新式转型: const_cast(expression) dynamic_cast(expression) reinterpret_cast(expression) static_cast( ...

  8. reinterpret_cast and const_cast

    reinterpret_cast reinterpret意为“重新解释” reinterpret_cast是C++中与C风格类型转换最接近的类型转换运算符.它让程序员能够将一种对象类型转换为另一种,不 ...

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

    一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...

  10. 《C++必知必会》学习笔记

    转载:http://dsqiu.iteye.com/blog/1734640 条款一 数据抽象 抽象数据设计遵循步骤:(1)为类型取一个描述性的名字.(2)列出类型所能执行的操作,不要忘了初始化(构造 ...

随机推荐

  1. python第一章pta习题总结

    chapter 1 一.选择判断部分 1.高级语言程序要被机器执行,只有用解释器来解释执行.(F) 计算机高级语言按程序的执行方式可以分为编译型和解释型两种. 执行方式 跨平台 特点 缺点 代表语言 ...

  2. C++ GDAL用CreateCopy()新建栅格并修改波段的个数

      本文介绍基于C++语言GDAL库,为CreateCopy()函数创建的栅格图像添加更多波段的方法.   在C++语言的GDAL库中,我们可以基于CreateCopy()函数与Create()函数创 ...

  3. lock锁,Semaphore信号量,Event事件,进程队列Queue,生产者消费者模型,JoinableQueue---day31

    1.lock锁 # ### 锁 lock from multiprocessing import Process,Lock import json,time # (1) lock的基本语法 " ...

  4. 通过paramiko模块操作服务器

    用于帮助开发者通过代码远程连接服务器,并对服务器进行操作. 如果下面运行错误了,可以看我另外一篇文章有解决办法解决paramiko连接远程服务器错误 pip3 install paramiko imp ...

  5. ProtoBuffer-nanopb介绍

    目录 一.需求 二.环境 三.相关概念 3.1 protocol buffer介绍 3.2 nanopb(支持C语言) 3.3 proto文件 四.proto基本语法 4.1 proto文件的定义 4 ...

  6. 【Azure Developer】在使用中国区 Azure AD B2C时, AUTHORITY的值是什么呢?

    问题描述 使用MSAL4J的SDK调用(源码地址:https://github.com/Azure-Samples/ms-identity-msal-java-samples/tree/main/3. ...

  7. Java 常用类 于 StringBuffer 和 StringBuilder的使用 + String三者的异同

    1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 /** 6 * 关于 StringBuffer 和 StringB ...

  8. Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)

    @ 目录 题面 链接 题意 题解 代码 总结 题面 链接 C. Kefa and Park 题意 求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现,当 ...

  9. C++ STL之 map 学习笔记

    •何为 map? map 是 STL 的一个关联容器,它提供一对一的数据处理,map 中存放的是一个 key-value键值对,其类型可以自己定义: 第一个可以称为关键字,每个关键字在 map 中只能 ...

  10. linux 无法找到“/usr/bin/core_perl/gcc” vscode

    解决问题的思路 查看有没有gcc,没有安装 有的话就是,修改安装路径就可以? "/usr/bin/core_perl/gcc".修改成Gcc的绝对路径 我的修改是./usr/bin ...