尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【C++】C++的类型转换--详解
一.C语言的类型转换在 C 语言里当赋值运算符两边类型不一致、形参和实参类型不匹配、或者函数返回值与接收变量类型不一样时就会触发类型转换。C 语言的类型转换分为两种隐式类型转换与显式类型转换。隐式类型转换由编译器在编译期间自动完成可以转换就执行转换无法转换则直接编译报错。显式类型转换需要程序员手动编写代码完成转换。来看代码#include stdio.h void Test () { int i 1; // 隐式类型转换int自动转为double double d i; printf(%d, %.2f\n , i, d); int* p i; // 显式强制类型转换把指针地址转为整型 //注意指针转int存在平台风险64位下建议用uintptr_t int address (int) p; printf(%p, %d\n , p, address); } int main(void) { Test(); return 0; }C语言强转缺陷转换的可视性较差所有转换都写成同一种形式很难定位出错的类型转换不利于跟踪错误。二.为什么C需要四种类型转换C 风格的转换格式很简单但是有不少缺点的隐式类型转化有些情况下可能会出问题比如数据精度丢失。显式类型转换将所有情况混合在一起代码不够清晰。因此 C 提出了自己的类型转化风格注意因为 C 要兼容 C 语言所以 C 中还可以使用 C 语言的转化风格。三.C 强制类型转换标准 C 为了加强类型转换的可视性引入了四种命名的强制类型转换操作符static_cast普通静态类型转换reinterpret_cast二进制重新解释转换const_cast修改常量属性dynamic_cast多态安全向下转换运行校验1.static_caststatic_cast 适用于非多态类型之间的静态转换。凡是编译器能够自动隐式完成的类型转换都可以使用 static_cast 显式写出但它不支持两个毫无关联的类型相互转换。#include iostream using namespace std; int main() { double d 12.34; // 把double转为int属于相近类型转换static_cast合法 int a static_castint(d); cout a endl; return 0; }double 向 int 转换属于合法的数值类型转换static_cast 在编译阶段完成转换直接舍弃小数部分输出 12。static_cast 不支持无关类型如指针与 int的转换。2.reinterpret_castreinterpret_cast 会直接对数据的二进制位重新解读适合把一种完全不同的类型转换成另一种类型不做类型安全性检查。注意这种转换仅仅改变类型解释方式不会修改内存里的二进制内容风险很高。#include iostream using namespace std; int main() { double d 12.34; int a static_castint(d); cout a endl; // static_cast不支持整型向指针转换编译报错 //int *p static_castint*(a); //强行把整型数值解释成指针地址 int *p reinterpret_castint*(a); return 0; }整型与指针是无关类型static_cast 不支持转换。reinterpret_cast 直接将 a 中的数值解读成指针地址仅改变类型视角不改动二进制数据。该转换语法可行但得到的是无效地址不要对指针解引用风险较大。3.const_castconst_cast 主要用来移除或者增加变量的 const 属性最常见用法是去掉 const 限定。注意它不是真正消除常量本身的只读属性只是修改指针 / 引用的类型如果原本是常量强行修改会出现未定义行为。#include iostream using namespace std; void Test() { const int a 2; //去掉const属性用普通指针接收常量的地址 int* p const_castint*(a); *p 3; cout a endl; } int main() { Test(); return 0; }普通指针无法接收 const 变量的地址借助 const_cast 去除指针的 const 限制。但 a 本身是常量通过指针修改常量属于未定义行为运行结果不确定。const_cast 仅能增减 const 属性不支持其他类型转换。补充实用场景它更适合本来不是常量只是被 const 指针接收的情况这种修改是安全的。如果你想要我可以写一段安全使用 const_cast 的示例。4.dynamic_castdynamic_cast 用来完成父类指针或引用向子类指针或引用的动态转换。向上转型子类指针 / 引用转为父类指针 / 引用依靠赋值兼容规则不需要强制转换。向下转型父类指针 / 引用转为子类指针 / 引用使用 dynamic_cast 可以实现安全转换。注意 dynamic_cast 只能用在包含虚函数的父类中。 转换时它会先做运行时检查如果转换合法就正常转换转换失败指针会返回空指针 0。#include iostream using namespace std; class A { public: virtual void f() {} }; class B : public A { }; void fun(A* pa) { B* pb1 static_castB*(pa); B* pb2 dynamic_castB*(pa); cout pb1: pb1 endl; cout pb2: pb2 endl; } int main() { A a; B b; fun(a); fun(b); return 0; }A 类中写了虚函数这是 dynamic_cast 能够正常使用的前提。第一次调用 fun (a)传进去的是父类对象地址。 static_cast 不会在运行时校验对象真实类型直接强制转为 B 类指针拿到的指针是无效的 dynamic_cast 运行时检测出原始对象是父类向下转换行不通直接返回空指针。第二次调用 fun (b)传入子类对象地址。 两种转换都能成功得到子类指针。static_cast 只在编译期间做简单检查向下转型存在安全隐患dynamic_cast 依靠运行时类型判断保证安全多用于多态代码。补充强制类型转换会跳过常规的类型检查。写代码时优先想想有没有不用强制转换的方案。实在不得不使用强制转换尽量缩小它的作用范围减少 bug 出现的可能性。四.RTTI了解RTTIRun-time Type identification 的缩写即运行时类型识别用来在程序运行阶段判断对象的真实类型。C 通过下面几个方式支持 RTTItypeid 运算符返回一个 type_info 对象用来查询表达式的实际类型。dynamic_cast 运算符前面讲过用于多态下安全向下转型能转就转不能转返回空指针。decltype在编译阶段推导表达式的类型主要配合模板和泛型编程使用。补充RTTI 需要依赖虚函数表来记录类型信息所以想要用 RTTI 判断类型前提是类里面包含虚函数通俗理解就是typeid 负责 看是什么类型dynamic_cast 负责 能不能安全转decltype 则偏编译期推导三者应用场景不太一样。
RELATED

相关推荐

LLM推理底层全链路拆解:Token生成、上下文窗口、解码策略

LLM推理底层全链路拆解:Token生成、上下文窗口、解码策略

前言我们打通了 自然语言 → 结构化机器指令 → 程序自动执行 的链路,解决了「AI输出不可控、机器无法自动化」的问题。但作为后端工程师,不能只会调用开源AI接口。想要做出低延迟、高稳定、可落地的AI服务,必须搞懂:大模型到底是…

📅 2026/9/9 7:05:50
ABAP 里有没有类似路由聚合的东西,真正对应的不是一项语法,而是把大量内部细节压缩成少数稳定入口

ABAP 里有没有类似路由聚合的东西,真正对应的不是一项语法,而是把大量内部细节压缩成少数稳定入口

计算机网络里的路由聚合,刚理解的时候很容易留下一个印象,好像它只是把几条路由合并一下。 其实它解决的是一个很典型的工程问题。 系统内部可以非常复杂,但没有必要把所有复杂性都暴露给系统外部。 Cisco 对 Route Aggregation 的解释非常直接,多条更具体的路由,可以由…

📅 2026/9/24 12:45:30
样本内测试与样本外测试:模型真实能力的试金石

样本内测试与样本外测试:模型真实能力的试金石

统计学里最容易被低估的两个词,我陪很多人踩过坑之后,今天认真聊聊“in sample test”和“out of sample”的区别。简单说,一个是在“自己家院子里考自己”,一个是“去别人家考场考自己”,两者的分数差距,往…

📅 2026/9/15 9:55:06
MORE NEWS

更多资讯

📰

DB2性能排查实战:从ACTIVE SESSION异常到LATCH与STACK根因定位

简介:这份文档面向DB2数据库运维DBA与性能调优学习者,取材于某银行DB2系统的一次真实故障:业务响应变慢、活动会话数异常攀升,常规排查CPU、内存、I/O与锁等待均无异常,最终锁定系统临时表空间TEMPSPACE1膨胀至10GB这一…

📰

NAS搭配RTX 4060 LP半高刀卡实现AI加速实战

1. 项目概述:当NAS遇上AI加速卡 去年帮朋友组装家庭NAS时遇到个头疼问题——他想在NAS上跑些AI模型处理照片,但标准尺寸显卡塞不进紧凑的机箱。直到最近发现技嘉推出的RTX 4060 LP半高刀卡,这个困扰迎刃而解。这张长度仅182mm、高度仅69mm的显…

📰

NAS升级AI计算卡实战:RTX 4060 LP加速大模型推理

1. 为什么要在NAS里装AI计算卡?这个想法最初源于我在搭建家庭媒体中心时的实际需求。作为一台7x24小时运行的设备,NAS本就是个天然的计算平台,但大多数商用NAS的CPU性能有限,跑个转码都吃力,更别说处理AI任务了。直到我…

📰

基于YOLOv10的工业安全帽实时检测系统实践

1. 项目概述:基于深度学习的安全帽检测系统 在工业安全生产领域,安全帽佩戴检测一直是个刚需场景。传统人工巡检方式存在效率低、漏检率高的问题,而基于计算机视觉的自动化检测方案正逐渐成为主流选择。这个毕设项目采用当前最前沿的YOLOv10算…

📰

字典序排序算法与Swift高效实现

1. 字典序排序问题背景 字典序排序是一种特殊的字符串比较方式,它按照字母表顺序逐字符比较。当我们将数字视为字符串时,这种排序方式会产生与数值大小完全不同的排列结果。比如数字1-20的字典序排列会是:1,10,11,12,13,14,15,16,17,18,19,2,…

📰

VC++6.0下Lex/Yacc实现的可运行SQL解析器原型

简介:本资源是西安电子科技大学《编译原理》课程配套上机实践报告,面向计算机专业本科生及编译技术初学者,聚焦词法与语法分析器设计及其在数据库管理系统(DBMS)中的落地应用。报告完整呈现了基于Lex/Yacc(…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬