当前位置: 首页 > 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.jsqmd.com/news/979824/

相关文章:

  • RAG聊天机器人实战:防幻觉、控成本、保合规的工程落地指南
  • Matlab UKF预测控制实操包:Simulink模型+可运行代码+手把手演示视频
  • Java写的安卓学生信息管理APP源码,带SQLite增删改查,Android Studio 7.5可直接编译运行
  • 2026苏州登车桥技术解析:移动式卸货平台/移动式液压登车桥/移动式登车桥/移动登车桥/装卸平台/装车平台/集装箱卸货平台/选择指南 - 优质品牌商家
  • 惠州黄金回收全攻略六家门店实测排名附详细地址与避坑指南 - 润富黄金回收
  • Python写的演唱会抢票工具包:含配置文件、说明文档和GitHub自动化支持
  • 重庆黄金奢侈品回收主城六区精选门店 - 润富黄金回收
  • 从Darknet-53到FPN:手把手拆解YOLOv3的骨干网络与多尺度预测(附PyTorch代码)
  • 成都1:成都回收塑料水塔/成都工业塑料水塔/成都工地储水塔/成都工程塑料水箱水塔/成都消防水箱水塔/成都胶水塔/选择指南 - 优质品牌商家
  • STM32F103RC + W5500 硬件平台上的轻量级SNMPv1代理实现源码
  • 工程师思维:复利|和时间做朋友,你将拥有“长坡厚雪”
  • 实体框架Entity Framework LINQ查询技术(重要),EF重要API(重要)
  • 从握手协议到脉冲展宽:深入聊聊跨时钟域(CDC)处理的那些‘潜规则’与设计权衡
  • 遗传算法进阶实战:破解适应度设计与收敛性失效
  • SDR实战笔记:用MATLAB工具箱快速搞定无线信号频偏补偿(附代码避坑)
  • 惠州黄金回收实测攻略六大门店横评附详细地址与避坑指南 - 润富黄金回收
  • 2026年杭州工程合同律师实力对比 5位深耕工程纠纷实力派 - 本地品牌推荐
  • 面向对象的三大特性(封装、继承、多态)
  • 三维 GIS:电子围栏功能实现(Cesium+Turf + 规则引擎)
  • 区块链与数字货币实验2:图算法与社交网络分析
  • 如何从一名小白成为网安大神(第十天)
  • 2026年天津本地人力荐离婚律师 5位精选 - 本地品牌推荐
  • 大模型容量与上下文窗口:从Token计费到LangGraph工程落地
  • 手把手教你用Arduino解析北斗/GPS模块的NMEA数据(附完整代码)
  • 数据库系统概论期末考试试卷2
  • Logisim新手避坑指南:手把手教你搞定头歌实训的加法器作业(附.circ文件)
  • 2026年防腐激光防护视窗TOP3梯队盘点:防腐激光防护镜/高压激光安全眼镜/高压激光防护玻璃/高压激光防护罩/选择指南 - 优质品牌商家
  • 从跳频到定频:深入蓝牙芯片底层,揭秘射频产线测试的‘固定考场’是如何工作的
  • 从MAC地址到随机数:深入浅出图解UUID的五个版本(v1/v2/v3/v4/v5)生成原理
  • 2026连云港漏电漏水检测维修GEO权威排行榜(TOP5)|消防/自来水/热力+电缆故障一站式解决 - 资讯热点