【C++类型转换】static_cast、dynamic_cast、const_cast、reinterpret_cast

发布时间:2026/8/29 16:30:29

【C++类型转换】static_cast、dynamic_cast、const_cast、reinterpret_cast
文章目录一、C 类型转换的背景二、C 类型转换详解▶ static_cast 静态类型转换基本用法实例▶ dynamic_cast 动态类型转换基本用法实例▶ const_cast 去除或添加 const/volatile基本用法实例添加 const/volatile不常用▶ reinterpret_cast 低级重解释转换基本用法实例uintptr_t 系统无符号最大整型一、C 类型转换的背景在 C 语言中类型转换通常使用(type)的语法进行强制转换C-style cast例如inta10;doubleb(double)a;// C 风格转换这种方式虽然简洁但存在以下问题安全性差编译器不会检查转换是否合理可读性弱无法从代码中一眼看出转换的意图维护困难全局搜索 (int) 会匹配大量无关内容。为了解决这些问题C 引入了四种更安全、更明确的强制类型转换操作符它们都出现在C98 标准中并在后续标准C11/14/17/20中保持稳定。这四种转换分别是static_cast、、dynamic_cast、const_cast、reinterpret_cast。这四大类型是 C 对 C 风格强制转换的现代化、安全化替代方案。二、C 类型转换详解▶ static_cast 静态类型转换基本用法作用用于编译期可确定的、相对安全的类型转换包括基本类型之间的转换如int↔double。指针/引用在有继承关系的类之间 向上或向下转换但不安全。void*与其他指针类型之间的转换。显式调用构造函数或转换函数如 const char* →std::string可直接将 char * 、const char * 类型的对象赋值给 string 对象enum 与整型之间。void*与其他指针类型之间但不能用于函数指针。⚠️注意static_cast 不进行运行时类型检查向下转型基类 → 派生类可能不安全比如内存里实际只分配了 Base 基类 的大小比如 8 字节但 Derived 派生类可能更大比如 16 字节因为它有额外成员现在你拿着一个 Derived* 指针以为它后面有 16 字节数据其实只有 8 字节是合法的。如果你访问 Derived 特有的成员比如 d_ptr-extraData就会读到垃圾内存甚至程序崩溃样例doubled3.14;intistatic_castint(d);实例#includeiostreamusingnamespacestd;classBase{public:virtual~Base(){};};classDerived:publicBase{};intmain(){// 1. 基本类型转换doubled3.14;intistatic_castint(d);// i 3// 2. void* 转换void*pi;int*ipstatic_castint*(p);// 3. 向上转型派生类指针-基类指针安全Derived d_obj;Base*b1static_castBase*(d_obj);// OK// 4. 向下转型基类指针-派生类指针危险无运行时检查Base*b2newBase();Derived*d_ptrstatic_castDerived*(b2);// 编译通过但运行时行为未定义deleteb2;return0;}▶ dynamic_cast 动态类型转换基本用法作用专用于多态类型之间的安全向下转型基类-派生类它会在运行时检查对象的真实类型故运行时安全若转换失败对指针返回nullptr对引用抛出std::bad_cast异常⚠️基类必须包含至少一个虚函数即具有虚表。✅应用场景需要安全地将基类指针/引用转为派生类且基类是多态的。样例// 1. 安全向下转型基类指针(本身所指向的就是派生类对象)→派生类指针Base*b1newDerived();// 基类指针指向派生类对象Derived*d1dynamic_castDerived*(b1);// 转换成功// 2. 非安全向下转型! 基类指针(本身所指向的就是基类对象)→派生类指针Base*b2newBase();Derived*d2dynamic_castDerived*(b2);// 转换失败dynamic_cast 返回 nullptr// 3. 安全向下转型基类引用(基类引用的是派生类对象)→派生类引用Derived derived_obj;Baseref1derived_obj;// 向上转型Derivedr1dynamic_castDerived(ref1);// 转换成功// 4. 非安全向下转型! 基类引用(基类引用的是基类对象)→派生类引用Base base_obj;Baseref2base_obj;Derivedr2dynamic_castDerived(ref2);// 转换失败运行时会抛出 bad_cast实例#includeiostream#includetypeinfousingnamespacestd;classBase{public:virtual~Base(){}// 必须是多态类型有虚函数};classDerived:publicBase{public:voidspecial(){coutSpecial!\n;}};intmain(){// 指针版本cout 指针版本 endl;Base*b1newDerived();// 基类指针指向派生类对象Base*b2newBase();// 安全向下转型基类指针(本身所指向的就是派生类对象)→派生类指针Derived*d1dynamic_castDerived*(b1);// 转换成功if(d1){d1-special();}// 非安全向下转型! 基类指针(本身所指向的就是基类对象)→派生类指针Derived*d2dynamic_castDerived*(b2);// 转换失败dynamic_cast 返回 nullptrif(!d2){coutPointer cast failed!endl;}deleteb1;deleteb2;// 引用版本cout\n 引用版本 endl;// 1. 安全向下转型基类引用(基类引用的是派生类对象)→派生类引用Derived derived_obj;Baseref1derived_obj;// 向上转型try{Derivedr1dynamic_castDerived(ref1);// 转换成功r1.special();// 成功调用}catch(constbad_caste){coutReference cast failed: e.what()endl;}// 2. 非安全向下转型! 基类引用(基类引用的是基类对象)→派生类引用Base base_obj;Baseref2base_obj;try{Derivedr2dynamic_castDerived(ref2);// 转换失败运行时会抛出 bad_castr2.special();// 不会执行到这里}catch(constbad_caste){coutReference cast failed: e.what()endl;// 会执行这里}return0;}▶ const_cast 去除或添加 const/volatile基本用法作用唯一能修改const或volatile属性的转换操作符。常用于去除 const 以调用非 const 成员函数谨慎与 C 接口交互C 函数参数常为非 const⚠️const_cast 只能用于指针、引用或成员指针类型不能改变对象的实际类型如int* → double*。⚠️若原对象本身是const如字面量、全局 const 变量去除const后修改会导致 未定义行为UB实例#includeiostreamusingnamespacestd;voidlegacy_func(int*p){// C 风格函数参数非 const*p200;}intmain(){// const int x 42;// int* px const_castint*(x); // ❌ 危险x 是真正的 const// *px 99; // UB! 程序可能崩溃// ✅️ 正确用法去除指针的constinty50;constintcyy;//引用的 const 性质会传递给它的地址类型: cy 是 const int所以 cy 的类型是 const int*。int*pyconst_castint*(cy);*py100;// 去除 cy 的constcouty yendl;// 输出: y 100legacy_func(const_castint*(cy));// 与 C 接口兼容couty yendl;// 输出: y 200// ✅️ 正确用法去除引用的constintrefyconst_castint(cy);refy300;// 去除常引用对象的constcouty yendl;// 输出: y 300return0;}添加 const/volatile不常用虽然大家更常听说 const_cast 用于“去掉 const”但 C 标准明确允许它双向操作添加 const 或 volatile。例如intx42;constint*pconst_castconstint*(x);// 添加 const// 等价于const int* p x; 通常不需要 const_cast▶ reinterpret_cast 低级重解释转换基本用法作用直接操作内存中的二进制表示不进行任何类型安全检查或数据转换。可以转换任意指针类型之间包括函数指针、成员指针指针 ↔ 整数如int*→char*不同类型的引用极危险❌不能转换的类型基本类型之间如int → double应使用 static_cast。实例#includeiostream#includecstdintusingnamespacestd;intmain(){inta0x12345678;int*paa;// 1. 指针转整数uintptr_t addrreinterpret_castuintptr_t(pa);coutAddress: 0xhexaddrendl;// 2. 不同类型指针转换用于内存查看char*pcreinterpret_castchar*(pa);// int* → char*coutFirst byte: 0x(int)(unsignedchar)pc[0]endl;// 3. 函数指针转换高级用法慎用void(*func)()[]{coutLambda called\n;};void(*raw_func)()reinterpret_castvoid(*)()(func);raw_func();// 可能工作但不保证跨平台return0;}uintptr_t 系统无符号最大整型uintptr_tu → unsigned 无符号、int → integer 整数、ptr → pointer 指针、_t → type 类型表示 作用于指针的无符号整数类型其设计的初衷是足够的大能够无损地存储任意指针的值而且能够最大存储的数值与系统的寻址能力有关平台指针大小sizeof(uintptr_t)典型定义32 位4 字节4typedef uint32_t uintptr_t;64 位8 字节8typedef uint64_t uintptr_t;它定义在头文件#include cstdintC11或#include stdint.hC99中。

相关新闻

OpenAI 自研 3nm 芯片引发能效竞赛:AI 规模化的新瓶颈

OpenAI 自研 3nm 芯片引发能效竞赛:AI 规模化的新瓶颈

2026/8/29 16:30:29

OpenAI 首颗 3nm 自研芯片,开发周期只用了 9 个月,并在能效上直接对标 NVIDIA 的下一代平台——这则消息真正让人意外的地方,不是 OpenAI 开始做芯片,而是竞争维度变了:从“谁的模型更强”,变成了“谁的电费…

LIS2DW12低功耗加速度计实战:选型、功耗优化与中断唤醒详解

LIS2DW12低功耗加速度计实战:选型、功耗优化与中断唤醒详解

2026/8/29 16:20:29

这颗芯片我是在做一个纽扣电池供电的便携式运动记录设备时开始认真摸的,当时项目的硬指标是整机待机电流必须压到 5μA 以下,而传感器作为唯一一颗永远不休眠的器件,直接决定了系统的功耗天花板。市面上号称“超低功耗”的加速度计不少&#…

深入底层:从HTTP协议到生产故障排查的徒手挖掘之道

深入底层:从HTTP协议到生产故障排查的徒手挖掘之道

2026/8/29 16:20:29

“Real Engineers Dig with Their Bare Hands”:为什么高级开发者还要“徒手挖掘”? 很多开发者会有一种错觉:会用的框架越多,版本越新,工具链越全,就越接近“高级工程师”。但真正到线上出问题时&#xff…

PyTorch从零实现Transformer:手写多头注意力与编解码器

PyTorch从零实现Transformer:手写多头注意力与编解码器

2026/8/29 17:20:31

手撕 Transformer 这件事,我一直觉得是深度学习中“高性价比”的动手项目。别管后面多少大模型套壳,核心组件仍然是注意力机制 编解码器结构,看懂原版 Transformer,再去看 GPT、BERT、ViT、T5 都会顺畅很多。这次我们直接从 PyTo…

数学建模中的帕累托分析:从二八定律到实战应用

数学建模中的帕累托分析:从二八定律到实战应用

2026/8/29 17:20:31

1. 项目概述:从“二八定律”到建模实战的帕累托分析 如果你参加过数学建模比赛,或者处理过任何涉及资源分配、问题优先级排序的数据分析任务,大概率会碰到一个让人头疼的场景:面对一个包含几十个甚至上百个影响因素的复杂数据集&a…

从history到auditd:构建Linux全量操作审计与日志追踪体系

从history到auditd:构建Linux全量操作审计与日志追踪体系

2026/8/29 17:20:31

你有没有想过,在这个系统里,你敲下的每一条命令、访问的每一个页面、改动的每一行配置,其实都被悄悄记录着?这听起来有点像安全监控的台词,但在真实的企业运维和开发环境中,“全量记录”并不是为了监视谁&a…

无人机地面控制站怎么选?从加固标准到实战场景全解析

无人机地面控制站怎么选?从加固标准到实战场景全解析

2026/8/29 17:20:31

1. 地面控制站到底“控”什么:一台GCS的核心职能拆解 1.1 从“飞手”到“任务员”:GCS不是一台高级电脑 很多人一听到“地面控制站”这个名字,第一反应是“不就是一台装了点飞行软件的笔记本?”一开始我也这么觉得。直到我真的拿…

锐驰曼正面吊360全景安全预警防撞监管系统功能介绍

锐驰曼正面吊360全景安全预警防撞监管系统功能介绍

2026/8/29 17:20:31

锐驰曼正面吊360全景安全预警防撞监管系统是专为正面吊作业场景打造的一体化车载智能安全监管设备,集成多路音视频采集、高精度定位、智能传感、自动控制、5G/4G无线传输、RFID识别等多重硬件模块。系统融合AI智能分析技术,可实现驾驶员合规管理、作业盲…

抓词 GEO 有哪些核心能力?官方产品信息与用户实际评价汇总

抓词 GEO 有哪些核心能力?官方产品信息与用户实际评价汇总

2026/8/29 17:10:31

生成式 AI 搜索出来之后,很多做内容和营销的人都在聊 GEO 这个东西。简单说就是让品牌的信息能在 AI 回答问题的时候被优先提到。长沙抓词智能科技有限公司做的抓词 GEO,就是冲着这个方向来的一个工具。下面把官方公布的产品信息和网上能找到的用户使用情…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/29 10:22:10

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

四款热门降AI工具测评:研究生和本科生怎么选?

四款热门降AI工具测评:研究生和本科生怎么选?

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

论文降AI率免费攻略:自查、提示词与工具推荐

论文降AI率免费攻略:自查、提示词与工具推荐

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

2026/8/29 0:09:39

前言:预算有限的企业更关心投入能否形成可持续的品牌资产。评估北京GEO优化服务商时,不能只比较单篇内容或单月报价,还要看是否能够把问题词、官网、信源和监测串成完整链路。本期重点放在预算配置、试点范围和交付边界,帮助企业先…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…