C++ 显式类型转换(转载)
转载自C 显式类型转换详解static_cast、dynamic_cast、const_cast、reinterpret_cast-CSDN博客一、引言在C编程中类型转换是连接不同数据类 型、实现多态和内存操作的重要桥梁。与 C 语言中简单粗暴的强制类型转换 (type)expression 不同C 引入了四种显式类型转换运算符static_cast、dynamic_cast、const_cast 和 reinterpret_cast。它们提供了更安全、更明确的转换语义是现代 C 编程中推荐使用的类型转换方式。二、static_cast静态类型转换static_cast是最常用的类型转换运算符用于在编译期已知的、有明确定义的类型之间进行转换。2.1 基本用法// 1. 基本数据类型转换 double d 3.14; int i static_castint(d); // i 3 // 2. 指针/引用在类层次结构中的向上转换安全 class Base {}; class Derived : public Base {}; Derived derived; Base* basePtr static_castBase*(derived); // 向上转换安全 // 3. 空指针转换 void* voidPtr nullptr; int* intPtr static_castint*(voidPtr); // 4. 枚举与整数类型转换 enum Color { RED, GREEN, BLUE }; int colorValue static_castint(GREEN); // colorValue 12.2 注意事项不进行运行时检查转换的安全性由程序员保证不能移除 const/volatile 限定符这是const_cast的职责不能用于无关类型指针转换如int*转double*三、dynamic_cast动态类型转换dynamic_cast专门用于具有多态性的类层次结构含有虚函数在运行时进行类型检查。3.1 基本用法class Animal { public: virtual ~Animal() {} // 必须有虚函数 }; class Dog : public Animal { public: void bark() { cout Woof! endl; } }; class Cat : public Animal { public: void meow() { cout Meow! endl; } }; // 向下转换运行时检查 Animal* animal new Dog(); Dog* dog dynamic_castDog*(animal); // 成功返回 Dog* if (dog) { dog-bark(); // 安全调用 } Cat* cat dynamic_castCat*(animal); // 失败返回 nullptr if (!cat) { cout 转换失败 endl; } // 引用转换失败时抛出 std::bad_cast try { Dog dogRef dynamic_castDog(*animal); } catch (const std::bad_cast e) { cerr 转换失败: e.what() endl; }3.2 使用场景向下转换将基类指针/引用转换为派生类交叉转换在多继承中转换到另一个基类运行时类型识别配合 RTTI 使用四、const_cast常量性转换const_cast专门用于添加或移除const和volatile限定符。4.1 基本用法// 1. 移除 const 限定符谨慎使用 const int constValue 42; int* mutablePtr const_castint*(constValue); *mutablePtr 100; // 未定义行为原对象是 const // 2. 添加 const 限定符安全 int value 10; const int* constPtr const_castconst int*(value); // 安全 // 3. 调用非 const 成员函数 class MyClass { public: void modify() { /* 修改成员 */ } void inspect() const { /* 只读操作 */ } }; const MyClass obj; // obj.modify(); // 错误不能调用非 const 成员函数 MyClass nonConstRef const_castMyClass(obj); nonConstRef.modify(); // 语法正确但可能破坏 const 语义4.2 注意事项不要修改原本就是 const 的对象会导致未定义行为主要用于兼容旧接口如调用接受非 const 参数的函数volatile 转换类似用于添加/移除 volatile 限定符五、 reinterpret_cast重新解释转换reinterpret_cast提供最低级别的重新解释几乎不进行任何检查是最危险的转换。5.1 基本用法// 1. 指针与整数之间的转换 int value 0x12345678; void* ptr reinterpret_castvoid*(value); // 整数转指针 uintptr_t intValue reinterpret_castuintptr_t(ptr); // 指针转整数 // 2. 无关类型指针之间的转换 struct Data { int x; double y; }; Data data{10, 3.14}; char* bytes reinterpret_castchar*(data); // 按字节访问 // 3. 函数指针转换 typedef void (*FuncPtr)(); void myFunc() {} FuncPtr func reinterpret_castFuncPtr(myFunc);5.2 使用场景与风险底层系统编程硬件寄存器访问序列化/反序列化内存布局转换极度危险可能违反严格别名规则导致未定义行为不可移植依赖具体平台和编译器实现六、 四种转换对比总结转换类型检查时机主要用途安全性性能开销static_cast编译期相关类型转换、向上转换、数值转换中等程序员负责无dynamic_cast运行期多态类层次间的向下/交叉转换高运行时检查有RTTIconst_cast编译期添加/移除 const/volatile 限定符低可能破坏 const 语义无reinterpret_cast编译期无关类型间的重新解释极低几乎无检查无七、 最佳实践建议优先使用 static_cast对于大多数类型转换需求慎用 dynamic_cast考虑是否能用虚函数替代避免 const_cast 修改 const 对象const 语义很重要最后考虑 reinterpret_cast确认没有其他安全方案替代 C 风格转换(type)expr 应替换为合适的 C 转换添加注释说明特别是 reinterpret_cast 和危险的 const_cast八、常见问题与解答Q1: 什么时候用 static_cast什么时候用 dynamic_castA如果转换在编译期就能确定安全如向上转换用 static_cast如果需要运行时检查类型如向下转换用 dynamic_cast。Q2: const_cast 会修改原本 const 的对象吗A语法上可以但这是未定义行为。const_cast 应仅用于去掉原本不是 const 的对象的 const 限定符。Q3: reinterpret_cast 和 static_cast 有什么区别Astatic_cast 在相关类型间转换有明确定义reinterpret_cast 是简单的二进制重新解释几乎不进行任何检查。Q4: 为什么 C 要引入四种转换A为了提供更明确的语义让代码意图更清晰编译器能进行更好的检查避免 C 风格转换的模糊性和潜在错误。九、 总结C 的四种显式类型转换运算符各有其明确的用途和语义static_cast通用的、编译期检查的类型转换dynamic_cast运行期检查的多态类型转换const_cast常量性限定符的添加/移除reinterpret_cast低级别的二进制重新解释正确选择和使用这些转换运算符能显著提高代码的安全性 、可读性和可维护性。记住能用 static_cast 就不用 dynamic_cast能用 dynamic_cast 就不用 reinterpret_cast尽量避免 const_cast 修改 const 对象。

相关新闻

2027最新:知网查重中“学术套话”标红怎么手动修改?(附10组经典去红句式)

2027最新:知网查重中“学术套话”标红怎么手动修改?(附10组经典去红句式)

写过毕业大论文或者小论文的同学都知道,知网查重和 AIGC 检测最喜欢标红的地方,除了核心算法和实验数据分析外,就是那些我们在文章开头、结尾或者章节过渡时大量引用的“学术套话”(如“随着社会经济的快速发展”、“众所周知”、…

2026/10/17 6:29:53 阅读更多 →
鸡健康状态图像数据集(RGB与热红外)

鸡健康状态图像数据集(RGB与热红外)

鸡健康状态图像数据集是一个多模态家禽健康监测数据集,包含 RGB 可见光和红外热成像双模态图像,涵盖健康、患病和死亡三类健康状态。数据集从受控养殖场环境采集,支持机器学习、计算机视觉和传感器融合研究,特别适用于畜牧系统的异…

2026/10/16 21:50:17 阅读更多 →
还在手动转写录音逐字稿?2026年哪3款语音在线生成工具适合内容创作者

还在手动转写录音逐字稿?2026年哪3款语音在线生成工具适合内容创作者

简短结论 针对内容创作者、知识付费用户整理音频逐字稿,实现从“听过”到“学会”转化的需求,2026年三款主流语音在线生成工具各有适配场景:仅需免费基础转写可选网易见外工作台,处理多语言海外音频可选Transcribe,需要…

2026/10/16 6:29:22 阅读更多 →

最新新闻

Kimi-K3-DSpark-MLA-NPU部署实战:NPU推理加速从零到生产级完整清单

Kimi-K3-DSpark-MLA-NPU部署实战:NPU推理加速从零到生产级完整清单

【免费下载链接】Kimi-K3-DSpark-MLA-NPU 项目地址: https://ai.gitcode.com/Eco-Tech/Kimi-K3-DSpark-MLA-NPU 点击查看 免费下载 Kimi-K3-DSpark-MLA-NPU 是面向 NPU 推理加速 的 Kimi K3 大模型投机解码草稿模型(Draft Model)&#xff0c…

2026/10/18 3:03:07 阅读更多 →
SINR自适应波束形成器MVDR Matlab仿真:强干扰下阵列信号处理

SINR自适应波束形成器MVDR Matlab仿真:强干扰下阵列信号处理

简介:这是一份用于无线通信与雷达信号处理的自适应波束形成器MATLAB实现,核心算法基于最大信干噪比(SINR)准则,解决阵列天线在强干扰与噪声环境下期望信号接收质量不佳的问题,适合通信工程、信号处理方向的…

2026/10/18 3:03:07 阅读更多 →
使用Windows自带IIS工具搭建FTP服务,详细教程!

使用Windows自带IIS工具搭建FTP服务,详细教程!

这篇教程搭建FTP服务的方式是采用Windows系统自带的IIS工具,核心步骤主要有4个: 1、安装IIS工具; 2、设置开机启动FTP服务; 3、创建FTP用户; 4、配置FTP服务器; 声明一下:搭建FTP建议升级成 Win…

2026/10/18 3:03:07 阅读更多 →
AI PR门禁落地实践:用GitHub Actions搭建结构化代码审查流水线

AI PR门禁落地实践:用GitHub Actions搭建结构化代码审查流水线

上个月我们团队终于把"AI先审、人工再审"这套流程正式固化成了一条CI流水线,跑在GitHub Actions里。前前后后我们改过三版,踩了不少坑,最后发现整个接入过程其实就三个关键动作:触发工作流、让AI返回结构化结论、把结论…

2026/10/18 3:03:07 阅读更多 →
2026年告别Token焦虑:AI API聚合站怎么选,四大顶级平台测评实录

2026年告别Token焦虑:AI API聚合站怎么选,四大顶级平台测评实录

做 AI 应用最让人头疼的莫过于 Token 账单与多平台管理:模型分散在 OpenAI、Anthropic、Google 与各家国产厂商,注册、充值、对账样样费神。API 聚合站正是为此而生的"AI 模型超市"——不需要逐家注册账号,也无需折腾国外信用卡&am…

2026/10/18 3:03:07 阅读更多 →
ODL下发SRv6卡壳?用Expect脚本打通SSH批量配置的最后一公里

ODL下发SRv6卡壳?用Expect脚本打通SSH批量配置的最后一公里

记不清这是第几次被问“ODL能不能直接下发SRv6策略”了,尤其在刚接触OpenDaylight(ODL)的人眼里,控制器有了RESTCONF、NETCONF,批量下发OSPF、BGP这类配置应该是顺手的事。但真在现场跑一次,你会发现理想和…

2026/10/18 3:02:07 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →