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

【C++】强制类型转换

目录

  • 🚀前言
  • 🌟static_cast:最常用的“非多态”转换
    • 💯适用场景
    • 💯代码示例
    • 💯注意点
  • 💻reinterpret_case:底层“位模式”的重新解释
    • 💯适用场景
    • 💯代码示例
    • 💯注意点
  • ☘️const_cast:专门“移除 const 限定”
    • 💯适用场景
    • 💯代码示例
    • 💯注意点
  • 🎋dynamic_cast:运行时的“多态安全转换”
    • 💯适用场景
    • 💯代码示例
    • 💯注意点
  • 🦜总结:四种转换的分工

🚀前言

在这里插入图片描述

大家好!我是 EnigmaCoder

  • 在 C 语言中,我们习惯用 (type)expression 的“粗暴”方式做类型转换,但这种方式安全性不足、意图不明确。C++ 为了更安全、更清晰地控制类型转换,提供了 四种专用的强制类型转换运算符static_castreinterpret_castconst_castdynamic_cast

🌟static_cast:最常用的“非多态”转换

static_cast最常用 的类型转换运算符,主打 “非多态场景” 的类型转换,编译期间就会做合法性检查,能替代 C 语言中普通的类型转换。

💯适用场景

  1. 基本数据类型之间的转换(如 intfloat 互转);
  2. 将任意类型转换为 void 类型;
  3. 空指针(或 void*)与具体类型指针的转换;
  4. 类继承体系中 “向上转换”(派生类 → 基类,天然安全)。

💯代码示例

#include <iostream>
using namespace std;int main() {// 1. 基本数据类型转换float floatNum = 3.14f;int intNum = static_cast<int>(floatNum);cout << "float → int: " << intNum << endl; // 输出:3(小数被截断)intNum = 5;floatNum = static_cast<float>(intNum);cout << "int → float: " << floatNum << endl; // 输出:5.0// 2. 空指针与具体指针转换void* voidPtr = nullptr;int* intPtr = static_cast<int*>(voidPtr);cout << "void* → int*: " << intPtr << endl; // 输出:0(nullptr)return 0;
}

💯注意点

  • 类继承中 “向下转换”(基类 → 派生类)时,static_cast 不做运行时检查。如果转换逻辑错误,会导致“未定义行为”(此时应该用 dynamic_cast)。

💻reinterpret_case:底层“位模式”的重新解释

reinterpret_cast 主打 “底层位模式的重新解释”,它不做数据转换或类型检查,完全是“按位硬转”,因此风险很高,仅用于特殊底层场景。

💯适用场景

  • 不同类型指针/引用之间的“位模式”直接转换;
  • 整数与指针之间的底层转换(依赖平台实现,少用)。

💯代码示例

#include <iostream>
using namespace std;int main() {// 1. 字符 → 整数(直接解释 ASCII 位模式)char ch = 'A'; // 'A' 的 ASCII 码是 65int ascii = reinterpret_cast<int&>(ch);cout << "char → int(ASCII 值): " << ascii << endl; // 输出:65// 2. 指针类型的底层转换(int* → float*)int* intPtr = nullptr;float* floatPtr = reinterpret_cast<float*>(intPtr);cout << "int* → float*: " << floatPtr << endl; // 输出:0(与 intPtr 地址一致)return 0;
}

💯注意点

  • reinterpret_cast 完全跳过 C++ 类型系统,极易引发“未定义行为”,仅在硬件操作、二进制协议解析等底层场景使用。

☘️const_cast:专门“移除 const 限定”

const_cast 是“专项工具”——专门用于移除指针或引用的 const(或 volatile)属性,让原本被 const 限制的指针/引用能修改指向的内容。

💯适用场景

  • 移除指针的 const 属性;
  • 移除引用的 const 属性。

💯代码示例

#include <iostream>
using namespace std;int main() {int num = 100; // 注意:若原对象本身是 const,修改会出问题,这里用非 const 变量演示const int* constPtr = &num;// 移除指针的 const 属性int* normalPtr = const_cast<int*>(constPtr);*normalPtr = 200;cout << "修改后 num: " << num << endl; // 输出:200// 移除引用的 const 属性const int& constRef = num;int& normalRef = const_cast<int&>(constRef);normalRef = 300;cout << "再次修改后 num: " << num << endl; // 输出:300return 0;
}

💯注意点

  • 如果原始对象本身声明为 const(如 const int num = 100;),用 const_cast 移除 const 后再修改它,会导致“未定义行为”(程序可能崩溃或结果异常)。

🎋dynamic_cast:运行时的“多态安全转换”

dynamic_cast 主打 “多态类(含虚函数)的运行时类型检查”,主要用于类继承体系中“向上转换”(派生 → 基类)或“向下转换”(基类 → 派生),保证转换的安全性。

💯适用场景

  • 类继承中 “向下转换”(基类 → 派生类),运行时检查是否合法;
  • 类继承中 “向上转换”(派生 → 基类),效果和 static_cast 一致;
  • 多继承场景下的“交叉转换”。

💯代码示例

#include <iostream>
using namespace std;// 基类:必须包含虚函数,才能启用“运行时类型识别(RTTI)”
class Base {
public:virtual void show() { cout << "Base class" << endl; }
};class Derived : public Base {
public:void show() override { cout << "Derived class" << endl; }
};int main() {// 场景1:基类指针指向派生类对象(向下转换合法)Base* basePtr1 = new Derived();Derived* derivedPtr1 = dynamic_cast<Derived*>(basePtr1);if (derivedPtr1 != nullptr) {cout << "dynamic_cast(Base*→Derived*)成功: ";derivedPtr1->show(); // 调用 Derived 的 show()}// 场景2:基类指针指向基类对象(向下转换非法,返回 nullptr)Base* basePtr2 = new Base();Derived* derivedPtr2 = dynamic_cast<Derived*>(basePtr2);if (derivedPtr2 == nullptr) {cout << "dynamic_cast(Base*→Derived*)失败(符合预期)" << endl;}// 释放动态内存delete basePtr1;delete basePtr2;return 0;
}

💯注意点

  • dynamic_cast 依赖 “运行时类型信息(RTTI)”,因此基类必须包含虚函数(否则编译报错);
  • 向下转换时,若基类指针实际指向派生类对象,转换成功;否则返回 nullptr(指针场景)或抛出异常(引用场景)。

🦜总结:四种转换的分工

转换运算符核心作用场景特点
static_cast日常非多态转换,编译期检查最常用、安全(非向下转)
reinterpret_cast底层位模式重新解释风险高,仅底层场景用
const_cast专门移除 const 限定专项工具,需谨慎修改
dynamic_cast多态类的运行时安全转换依赖虚函数,运行时检查

文章转载自:

http://bd56KAil.gnwpg.cn
http://mQme2HOZ.gnwpg.cn
http://ss9hgjCW.gnwpg.cn
http://W2qCokbU.gnwpg.cn
http://Elsp7fXC.gnwpg.cn
http://vv19QVzI.gnwpg.cn
http://3n5DISQ0.gnwpg.cn
http://vQoRcuXs.gnwpg.cn
http://6FUNSrQd.gnwpg.cn
http://MSPn7CjJ.gnwpg.cn
http://fMbW2PsD.gnwpg.cn
http://3TF4Heo3.gnwpg.cn
http://XWHV9TM6.gnwpg.cn
http://B4qk3t9A.gnwpg.cn
http://lPD3n0Wj.gnwpg.cn
http://RcDfA8nn.gnwpg.cn
http://iWKBEA2K.gnwpg.cn
http://5dZzkHQm.gnwpg.cn
http://dZXdrlSR.gnwpg.cn
http://5Hf8GyVb.gnwpg.cn
http://92R9pr8U.gnwpg.cn
http://KLk5ZIfo.gnwpg.cn
http://uU4mkPoO.gnwpg.cn
http://apeSvMN0.gnwpg.cn
http://TC6zcfI5.gnwpg.cn
http://nosgIfdi.gnwpg.cn
http://DPpgscQ4.gnwpg.cn
http://hhFpGlZy.gnwpg.cn
http://cbLG0jqL.gnwpg.cn
http://iYbuyOOb.gnwpg.cn
http://www.dtcms.com/a/373194.html

相关文章:

  • LSAGNet:用于图像超分辨率的轻量级自注意力引导网络
  • Rust在医疗系统中的应用:安全、性能与合规性实践(下)
  • 房屋安全鉴定机构服务内容
  • 【系统分析师】第16章-关键技术:系统运行与维护(核心总结)
  • 【Spring】原理解析:Bean的作用域与生命周期
  • GitLab 分支管理与 Push 问题全解析
  • 基于SpringBoot+MYSQL开发的AI智能大数据医疗诊断平台
  • 分解+优化+预测!CEEMDAN-Kmeans-VMD-DOA-Transformer-LSTM多元时序预测
  • Matlab机器人工具箱使用2 DH建模与加载模型
  • 趣味学RUST基础篇(构建一个命令行程序完结)
  • 基于STM32的智能宠物看护系统设计与实现
  • 基于SpringBoot的家政保洁预约系统【计算机毕业设计选题 计算机毕业设计项目 计算机毕业论文题目推荐】
  • 幂等性、顺序性保障以及消息积压
  • 第一次使用coze工作流,生成简易行业报告
  • tl;dv:让你的会议更高效
  • 【入门级-算法-6、排序算法: 插入排序】
  • 健康度——设备健康续航条
  • 深入理解Spring Boot的EnvironmentPostProcessor:环境处理的黑科技
  • 面向生产环境的大模型应用开发
  • elastic search 是如何做sum操作的
  • HashMap高频面试题目
  • 李沐深度学习论文精读(二)Transformer + GAN
  • 达梦数据库(DM8)单机数据库安装部署
  • 《sklearn机器学习——特征提取》
  • OnlyOffice的高可用方案如何做
  • 苍穹外卖前端Day1 | vue基础、Axios、路由vue-router、状态管理vuex、TypeScript
  • 【RabbitMQ】----RabbitMQ 的7种工作模式
  • CN2 GIA线路深度解析:阿里云/腾讯云选哪个?(附三网评测)
  • 冰火岛 Tech 传:Apple Foundation Models 心法解密(下集)
  • Gamma AI:高效制作PPT的智能生成工具