c++中的四种cast转换
文章目录
- 前言
- 一、dynamic_cast
- 二、static_cast
- 三、const_cast
- 四、reinterpret_cast
- 总结
前言
C++继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险)
| 转换类型 | 典型用途 | 安全性 |
|---|---|---|
| static_cast | 相关类型转换(非多态) | 编译时检查 |
| dynamic_cast | 多态类型的向下转型 | 运行时检查 |
| const_cast | 修改 const/volatile 限定符 | 需开发者保证 |
| reinterpret_cast | 低级别二进制重新解释 | 高风险,平台依赖 |
| 建议:优先使用 static_cast 和 dynamic_cast,避免 const_cast 和 reinterpret_cast 除非必要。 |
C++11之后,C++中就有四种类型转换,分别是 dynamic_cast、static_cast、const_cast、reinterpret_cast,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。
如dynamic_cast<type-id> (expression)
这个表达式将 expression 转换为一个 type-id 类型的对象。 Type-id 必须是一个指针、指向一个已经定义类的类型或一个指向 VOID 的指针。 Expression 的类型必须是一个指针,如果 type-id 是一个指针;当 type-id 是一个引用的时候必须是一个左值。
一、dynamic_cast
用途:用于多态类型的安全向下转型(需运行时类型检查)。
常见场景:
- 将基类指针/引用转换为派生类指针/引用。
- 在运行时检查类型是否合法(失败时返回 nullptr 或抛出异常)。
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base);
if (derived) { // 转换成功
} else {// 转换失败(base不指向Derived对象)
}
条件:
基类必须有虚函数(即多态类型)。
需要启用RTTI(Run-Time Type Information,通常默认开启)。
RTTI:
运行时类型识别。程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型(判断指针原型)
RTTI提供了两个非常有用的操作符:typeid和dynamic_cast。(三个最主要的东西,dynamic_cast,typeid,type_info)
typeid:typeid函数(为type_info类的友元函数,为什么要这样呢?目的是防止创建type_info对象)的主要作用就是让用户知道当前的变量是什么类型的,它可以返回一个type_info的引用,可以获取类的名称和编码typeid重载了type_info中的==和!=可以用于判断两个类型是否相等
1)typeid识别静态类型
当typeid中的操作数是如下情况之一时,typeid运算符指出操作数的静态类型,即编译时的类型。
(1)类型名
(2)一个基本类型的变量
(3)一个具体的对象(非指针对象)
(4)一个指向 不含有virtual函数的类 对象的指针的解引用
(5)一个指向 不含有virtual函数的类 对象的引用
静态类型在程序的运行过程中并不会改变,所以并不需要在程序运行时计算类型,在编译时就能根据操作数的静态类型,推导出其类型信息。
二、static_cast
用途:用于“相关类型”之间的转换(编译器可理解的隐式或显式转换)。
常见场景:
- 基本数据类型转换(如 int → double)。
- 类层次结构中基类与派生类的指针/引用转换(需确保安全)。
- 将 void* 转换为具体类型指针。
- 显式调用构造函数或转换函数。
double d = 3.14;
int i = static_cast<int>(d); // double → intBase* base = new Derived();
Derived* derived = static_cast<Derived*>(base); // 需开发者确保安全
可以进行基本类型的转化,但是会损失精度类似与C语言的强制转化。跟reinterpret_cast不太一样reinterpret_cast是底层二进制的强制拷贝和语义转换不会损失精度。
三、const_cast
用途:移除或添加 const/volatile 限定符。
常见场景:
修改原本被声明为 const 的变量(但需确保原始对象本身不是常量)。
const int x = 10;
int* p = const_cast<int*>(&x); // 移除const
*p = 20; // 未定义行为!若x是真正的常量(如全局const),此处可能导致崩溃。// 合法用法:修改原本是非const的临时const引用
int y = 30;
const int& ref = y;
const_cast<int&>(ref) = 40; // 合法,因为y本身不是const
注意事项:
修改原始常量对象会导致未定义行为。
通常用于兼容旧代码或特定API设计。
四、reinterpret_cast
reinterpret_cast是四种强制转换中功能最为强大的(最暴力,最底层,最不安全)。它的本质是编译器的指令。
用途:低级别的类型重新解释(直接按二进制位解释数据)。
常见场景:
指针与整数之间的转换(如 void* → uintptr_t)。
无关类型指针之间的转换(如 int* → char*)。
int x = 42;
int* p = &x;
uintptr_t addr = reinterpret_cast<uintptr_t>(p); // 指针→整数char* buffer = reinterpret_cast<char*>(p); // int* → char*
注意事项:
高度依赖平台和编译器,可移植性差。
滥用可能导致未定义行为,仅在必要时使用(如系统编程、序列化)。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
相关文章:
c++中的四种cast转换
文章目录 前言一、dynamic_cast二、static_cast三、const_cast四、reinterpret_cast总结 前言 C继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险) 转换类型典型用途安全性static_cast相关类型转换(…...
矩阵补充,最近邻查找
矩阵补充,最近邻查找 矩阵补充是向量召回最简单的一种方法,现在不常用,学习矩阵补充是为了更好的理解后面学到的双塔模型 下图,输入用户ID和物品ID后从Eebedding层拿到对应的向量做内积,内积的结果就是矩阵补充 模型…...
gradio调用多个CSS的HTML页
很多博客介绍的gradio读取html和css比较简单,如果要做很细致的前端页面优化,比如丰富的响应式的cssjs,至少要有html多个css,是暂不能实现的。bootstrap、font-awesome、jquery等 方案一当然是直接更换htmlcss为主的部署方式&#…...
NVIDIA NeMo 全面教程:从入门到精通
NVIDIA NeMo 全面教程:从入门到精通 文章目录 NVIDIA NeMo 全面教程:从入门到精通目录框架介绍NeMo的核心特点NeMo的架构NeMo与其他框架的比较NeMo的模型集合NeMo的工作流程NeMo 2.0的新特性 安装指南系统要求使用Docker容器安装步骤1:安装Do…...
Go 语言封装邮件发送功能
Go 语言封装邮件发送功能 🏆 目标📦 依赖包🌟 项目结构🚀 代码实现🛠️ 主要方法说明🧪 单元测试🌈 使用示例🏆 代码亮点🌟 改进方向🚀 总结 在现代 Web 开发…...
加新题了,MySQL 8.0 OCP 认证考试 题库更新
MySQL 8.0 OCP 认证考试 题库更新 MySQL 8.0 Database Administrator 考试科目:1Z0-908 近期发现,MySQL OCP认证考试题库发生变化,出现了很多新题,对此,CUUG专门收集整理了最新版本的MySQL考试原题,并会给…...
Thales靶机攻略
1.下载导入VBox,并启动靶机 靶机地址:https://download.vulnhub.com/thales/Thales.zip 解压后,在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成,设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…...
尝试使用Tauri2+Django+React项目(2)
前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做,搞了半天 笔者看到官网,原来可以使用二进制文件,好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…...
6.1 模拟专题:LeetCode 1576. 替换所有的问号
1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s,要求将所有 ? 替换为任意小写字母,使得替换后的字符串中 没有相邻的两个字符相同。 示例: 输入:s "?zs" →…...
Linux安装go环境
安装一个lazydocker,根据文档需要先安装go环境 https://github.com/jesseduffield/lazydocker 官方文档解析 https://go.dev/doc/install 文档内容如下,一共三步 1.删除先前安装的go,解压下载的go压缩包到/usr/local目录 2.添加环境变量&…...
卡特兰数在数据结构上面的运用
原理 Catalan数是一个数列,其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为:  其中,是组合数,表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…...
Unity知识点快速回顾系列
Unity知识点快速回顾系列导航 主要想用于快速回顾unity相关知识点,基本只讲解知识点,只有简单的示例,目前还在整理中。 一、C#知识点入门、基础、核心、进阶 二、Unity 知识点入门、基础、核心、进阶 三、Unity 数据持久化 四、Unity 知识点快…...
悟空crm v12安装好后出现 网络错误问题(已解决)
请求网址: http://wwww.aaaa.com/gateway/adminUser/queryUserNumInfo 请求方法: POST 状态代码: 502 Bad Gateway 远程地址: 101.37.79.226:9807 引荐来源网址政策: strict-origin-when-cross-origin...
便携版:随时随地,高效处理 PDF 文件
PDF-XChange Editor Plus 便携版是一款功能强大且极其实用的 PDF 阅读与编辑工具。它不仅支持快速浏览 PDF 文件,还提供了丰富的编辑功能,让用户可以轻松处理 PDF 文档。经过大神优化处理,这款软件已经变得十分轻便,非常适合需要随…...
【Golang】补充:占位符、转义字符、错误处理
🔥 个人主页:星云爱编程 🔥 所属专栏:Golang 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 1、占位符 1.1通用占位符 %v :默认格式的值。适…...
文件上传绕过的小点总结(4)
9.末尾点删除处理缺陷 给出源码: $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA,…...
AI比人脑更强,因为被植入思维模型【23】损失规避思维模型
我觉得这是一个很有趣的思维模型。 我们学习一个思维模型,不光是指导自己的思维,其实也可以预测或者思考别人的思维模型,也就是别人会怎么想,怎么做? 定义 三层解释思维模型是一种深入剖析事物本质的思考框架&#x…...
如何用Spring AI构建MCP Client-Server架构
现代 Web 应用正加速与大语言模型(LLMs)深度融合,构建超越传统问答场景的智能解决方案。为突破模型知识边界,增强上下文理解能力,开发者普遍采用多源数据集成策略,将 LLM 与搜索引擎、数据库、文件系统等外部资源互联。然而,异构数据源的协议差异与格式壁垒,往往导致集…...
如何让WordPress不同的页面、栏目显示不同的小工具侧边栏
WooSidebars 是一款用于 WordPress 的插件,主要功能是允许用户根据不同的上下文条件(如特定页面、博客文章、分类目录或搜索结果页面等)来更改侧边栏中显示的小工具。 自定义小工具区域:用户可以轻松创建自定义的小工具区域,并将其设置为在多种条件下显示,只需点击几次即…...
智慧座椅的节能效果如何?
嘿呀,你知道不,咱这叁仟智慧座椅的节能效果,那可是像个神秘小宇宙,根据不同的技术和应用场景,会展现出超有趣的变化哦,下面就给你唠唠常见的几种情况哈! 能源回收大变身:有些叁仟智…...
Matlab:二维绘图篇——不同坐标系下的绘图命令
目录 1.极坐标系下绘图:polar命令 实例——极坐标图形 实例——直角坐标与极坐标系图形 2.半对数坐标系下绘图:semilogx和semilogy 实例——半对数坐标系图形 3.双对数坐标系下绘图:loglog 实例——双对数坐标系绘图 4.双y轴坐标&…...
HTTP 协议中请求与响应的详细解析
前言:HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于在互联网上传输超文本的协议 --由一个请求和响应组成,一个完整的 HTTP 请求由请求行(Request Line)、请求头(Headers&…...
对三维物体模型的阈值操作
对三维物体模型的阈值操作 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头2. point_normal_x、point_normal_y、point_normal_z有什么区别?3. 去除离群点 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头 dev_open_win…...
prometheus 添加alertmanager添加dingtalk机器人告警
1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下...
一些题目记录
别人面经题目记录 https://zhuanlan.zhihu.com/p/32626732052 实现 NMS,七八次,很高频; 实现 MultiHeadSelfAttention,大概 三四次; 用 Numpy 或者 List 实现MLP 的前向和反向,4次; Leetcode …...
向量数据库学习笔记(1) —— 基础概念
一、 嵌入模型 Embedding Models 嵌入模型是将复杂数据(如文本、图像、音频等)转换为向量表示的机器学习模型 1. 核心概念 嵌入(Embedding):将高维、非结构化的数据映射到低维、稠密的向量空间 向量表示:输出固定长度的数值向量…...
Python学习第二十五天
Scrapy框架 官网概念 Scrapy 是一个强大的 Python 网络爬虫框架。 最新版本学习 安装 pip install scrapy 使用 # 创建名称为myscrapy的爬虫项目 scrapy starpoject myscrapy # 创建爬那个 就是比如 需要爬http://quotes.toscrape.com 运行的名称:toscrape运行…...
GitHub Copilot平替:CodeGeeX 2.0实测报告
本文基于20个真实开发场景对CodeGeeX 2.0进行深度评测,涵盖代码生成质量、上下文理解能力、多语言支持度等关键维度。通过Python数据分析、Java微服务、React前端开发三大核心场景的对比实验,揭示其相比GitHub Copilot在中文语境支持、本地化部署、隐私保…...
【算法】动态规划:回文子串问题、两个数组的dp
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 回文子串问题回文子串最长回文子串分割回文串 IV分割回文串 II *最长回文子序列让字符串成为回文串的最少插入次数 两个数组的dp最…...
文件上传绕过的小点总结(3)
6.文件首尾加空绕过 源码给出这样的,发现文件名处理没有首尾去空,于是我们可以采用首尾加空的方式绕过。 $file_name $_FILES[upload_file][name]; $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_e…...
