当前位置: 首页 > news >正文

c++的类型转换

在c语言中,类型转换一般是暴力转:

(类型)值 比如 (int)3.14、(char*)ptr

这样很明显有一些缺点:

  • 什么都能转,没有任何限制指针 ↔ 整数、const ↔ 非 const、无关类型之间乱转 → 极易崩溃、内存越界
  • 意图不明确你不知道这是:
    • 数值转数值?
    • 指针转指针?
    • 去掉 const?
    • 多态子类转父类?
  • 代码里搜不到全是(...),想排查错误根本找不到
  • 编译器无法帮你检查错误

但是c++是强类型语言,在c++中,认为这样很不安全,很乱,所以设置了四个专门用于转换的函数

  • 更安全
  • 意图更清晰
  • 编译器能检查错误
  • 代码更容易维护

dynamic_cast<>

动态转化 运行是检查 安全度最高
多态继承安全向下转换要求父类必须存在虚函数
//编译器可能会报错 看编译器,
指针和引用的转换不创建新对象,改变引用/指向
->只适用于上行转化-->子类对象转父类的引用/指针最好

指针失败返回空,引用失败抛出异常

// 指针转换 子类* 指针 = dynamic_cast<子类*>(父类指针); // 引用转换 子类& 引用 = dynamic_cast<子类&>(父类引用); class Father { virtual void func(){} }; // 必须有虚函数 class Son : public Father {}; Father* f = new Son(); // 安全向下转型 Son* s = dynamic_cast<Son*>(f); if(s != nullptr) { // 转换成功 } else { // 转换失败 }

最佳实践

  • 子类 → 父类(上行):static_cast/dynamic_cast都安全
  • 父类 → 子类(下行):必须用 dynamic_cast

reinterpret_cast

二进制重新解释,不进行任何安全检查,可以进行任意无关类型指针的转换-->针对指针
容易丢数据,编译期

  • 指针 ↔ 整数
  • 指针 A ↔ 完全无关的指针 B
  • 低级硬件操作、地址操作
class a{ }; class b { }; a*a1=new a(); b*b1=new b(); a=reinterpret_cast<a*>(b1); //虽然最后会成功,b的空间会被a指向 但就后面 delete a delete b //就会报错,因为a已经指向b了,delete就delete b,在de b就会错 int a = 10; int* p = &a; // 指针 → 整数 uint64_t addr = reinterpret_cast<uint64_t>(p); // 整数 → 指针 int* q = reinterpret_cast<int*>(addr);
    • 无关类型指针互转(int↔ char↔ 自定义类指针)
  • 指针 和 整型(long/uintptr_t)互相转换
  • 底层硬件、网络、二进制数据解析

const_cast


常转换,将const和非const之间进行转化-->(指针和引用类型)
编译期,唯一能修改 const /volatile 属性的转换

// 正确用法 const int a = 10; const int& ar = a; // 常引用 int& a1 = const_cast<int&>(ar); // 移除const → 可修改 a1 = 20; // 合法,但修改原本const变量是未定义行为! // 指针用法 const int* p = &a; int* q = const_cast<int*>(p); // 移除指针的const

static_cast

静态转换 :编译期完成、仅做语法 / 类型规则检查、无运行时类型校验的显式类型转换

  • void*与具体指针类型
  • 父子的转换(上行转换安全(子转父),下行不太安全)
  • 左值转右值(也可以用c++11的move函数)
  • 基础算术类型转换(隐转也可以优先隐)
// 基础类型 double d = 3.14; int i = static_cast<int>(d); // 继承关系 class Father {}; class Son : public Father {}; Son son; Father* f = static_cast<Father*>(&son); // 上行:安全 Son* s = static_cast<Son*>(f); // 下行:不安全! //空指针 void* p = malloc(4); int* q = static_cast<int*>(p);
http://www.zskr.cn/news/1491548.html

相关文章:

  • 2026苏州登车桥技术解析:移动式卸货平台/移动式液压登车桥/移动式登车桥/移动登车桥/装卸平台/装车平台/集装箱卸货平台/选择指南 - 优质品牌商家
  • 工程师思维:复利|和时间做朋友,你将拥有“长坡厚雪”
  • 惠州黄金回收实测攻略六大门店横评附详细地址与避坑指南 - 润富黄金回收
  • 如何从一名小白成为网安大神(第十天)
  • 大模型容量与上下文窗口:从Token计费到LangGraph工程落地
  • 面向对象的三大特性(封装、继承、多态)
  • 从跳频到定频:深入蓝牙芯片底层,揭秘射频产线测试的‘固定考场’是如何工作的
  • 如何安全合规地撰写AI技术博文:从业者内容创作指南
  • Labelme生成的JSON文件别乱扔!从标注到模型训练的全链路文件管理心得
  • 遗传算法进阶:自适应变异与熵驱动多样性控制
  • STM32F103简易电子琴实战工程:带OLED显示、16键音阶响应与面包板接线图,开箱即烧录
  • 海尔(Haier)空调全国售后服务电话 官方24小时维修客服售后中心 - 故障统计表
  • 告别取模软件!用C语言在51单片机上动态生成16x16点阵滚动字幕
  • 大语言模型推理优化:重复采样如何提升覆盖率与精度
  • 2026成都合成树脂瓦厂家评测:成都PC亮瓦/成都PC锁扣阳光板/成都PP装饰瓦/成都光扩散板/成都合成树脂瓦/选择指南 - 优质品牌商家
  • 不只是刷机:用QFIL和fh_loader命令行高效备份安卓手机eMMC全分区镜像
  • 用Verilog手把手搭建一个RISC-V单周期CPU(附完整代码与仿真)
  • MCP-RAG:动态检索与工具调用的AI新范式
  • PVT_V1中的SRA(空间缩减注意力)到底省了多少内存?手把手带你算笔账
  • 短剧MP4合并器
  • XUnity Auto Translator:终极指南 - 如何轻松将外语游戏变成中文版
  • 【西宁余生黄金回收】正规靠谱实测 - 润富黄金回收
  • 从MIT Cheetah 3看腿足机器人的“感知-规划-控制”闭环:不用外部视觉怎么爬楼梯?
  • Bayesian Odds:用比值思维实现可解释、可落地的贝叶斯决策
  • 2026年5月目前优秀的钢构企业找哪家,轻钢构/重钢构/钢构/钢结构幕墙/钢结构/幕墙/管桁架,钢构源头厂家哪家好 - 品牌推荐师
  • 向量数据库与嵌入式表示:LLM语义搜索的底层地基
  • 奥克斯(AUX)空调全国统一24小时售后服务人工电话400服务热线查询 - 故障统计表
  • 别再让亚稳态坑了你!手把手教你搞定FPGA跨时钟域(CDC)单bit信号同步
  • 保姆级教程:在Rockchip RK3588 EVB1开发板上点亮MIPI DSI屏幕(附完整DTS配置)
  • 从信息几何视角看α-散度:一个连续参数如何统一KL、海林格等十几种距离?