深入理解C++ 类型转换<一>static_cast 什么是 static_caststatic_cast是 C 中最常用的编译时类型转换运算符。它的核心逻辑是“编译期静态检查”——编译器在编译代码时根据已有的类型信息判断这个转换是否“说得通”如果说得通就通过说不通就报错。关键特性零运行时开销它不会像dynamic_cast那样在运行时去检查类型是否合法纯粹是编译期的指令重解释因此性能最高。有“常识”限制它只能用于有明确定义的转换如数值之间、继承关系的指针、void*等。它不能去掉const属性那是const_cast的事也不能把完全不相关的类型如int*转float*强行捏在一起那是reinterpret_cast的事。最常见的 4 种使用场景基本数值类型转换最安全如int转doubledouble转int注意精度丢失。类层次结构中的向上转换子类 → 父类安全编译器通常也能隐式做但显式写出来可读性更好。类层次结构中的向下转换父类 → 子类没有运行时检查需要程序员自己确保父类指针确实指向的是该子类对象否则会引发未定义行为UB。void*与具体类型指针互转C 语言风格的常见操作用static_cast更规范。#include iostream // 1. 定义一个简单的继承体系用于演示类转换 class Animal { public: virtual ~Animal() default; // 加虚析构让类变成多态类型虽然这里没用到 dynamic_cast但是好习惯 void speak() const { std::cout Animal sound std::endl; } }; class Dog : public Animal { public: void wagTail() const { std::cout Dog wags tail std::endl; } // 重写 speak但为了演示指针转换我们不把它设为 virtual避免干扰理解 }; class Cat : public Animal { public: void meow() const { std::cout Cat meows std::endl; } }; int main() { std::cout 1. 基本数值类型转换 std::endl; int a 10; int b 3; // 如果不转10/3 得 3转为 double 后得 3.333... double result static_castdouble(a) / b; std::cout 10 / 3 result std::endl; // 大范围转小范围注意精度截断 double pi 3.14159; int intPi static_castint(pi); std::cout double 3.14159 转为 int intPi std::endl; std::cout \n 2. 向上转换子类 - 父类 std::endl; Dog dog; // 将 Dog* 转为 Animal*这是绝对安全的子类一定包含父类的全部 Animal* animalPtr static_castAnimal*(dog); animalPtr-speak(); // 输出 Animal sound std::cout 向上转换成功 std::endl; std::cout \n 3. 向下转换父类 - 子类 std::endl; // 注意这里 animalPtr 实际上指向的是 Dog 对象所以向下转是安全的 Dog* dogPtr static_castDog*(animalPtr); dogPtr-wagTail(); // 正常输出 // 【危险示范】如果父类指针实际指向的是 Cat强行转为 Dog 会怎样 Cat cat; Animal* animalPtrToCat cat; Dog* wrongDogPtr static_castDog*(animalPtrToCat); // 编译通过但运行时不报错行为是未定义的UB。 // 下面这行代码可能会崩溃也可能输出乱码或者看似正常但实际污染内存 // 为了演示安全我们注释掉这行避免你的程序崩溃 // wrongDogPtr-wagTail(); std::cout static_cast 向下转换没有运行时检查开发者必须自己保证类型正确 std::endl; std::cout \n 4. void* 与具体类型互转 std::endl; int value 100; void* voidPtr value; // 任何指针都能赋值给 void* // 从 void* 还原为 int*必须用 static_cast int* recoveredPtr static_castint*(voidPtr); std::cout 从 void* 还原的值: *recoveredPtr std::endl; return 0; }

相关新闻

最新新闻

Delphi 12.3 安装配置 FastReport FMX Professional 2024.2.5 完整指南

Delphi 12.3 安装配置 FastReport FMX Professional 2024.2.5 完整指南

简介:本资源是专为Delphi 12.3开发者提供的FastReport FMX Professional 2024.2.5专业版报表控件安装包,面向使用FireMonkey框架开发跨平台桌面与移动应用的中高级Delphi程序员,解决FMX环境下高质量打印、导出与可视化报表集成难题。压缩包共…

2026/8/30 20:29:04
OpenAI 9个月自研3nm推理芯片Jalapeño,效率与速度双提升

OpenAI 9个月自研3nm推理芯片Jalapeño,效率与速度双提升

2025 年 AI 芯片领域最值得关注的变量,不是某家芯片巨头又发布了一张新卡,而是 OpenAI 把自己的芯片设计周期压到了 9 个月。这颗代号 “Jalapeo” 的自研 AI 芯片,采用 3nm 工艺,从公开报道看,核心目标是给 GPT 系列模…

2026/8/30 20:29:04
区块链投票系统毕业设计:从原理到实现的完整指南

区块链投票系统毕业设计:从原理到实现的完整指南

简介:这是一套面向计算机相关专业本科生的高分毕业设计项目资源,聚焦区块链技术在可信投票场景中的落地实现,适用于软件工程、计算机科学、人工智能等方向的学生完成毕设、课程设计或项目立项演示。资源包含完整可运行的区块链投票系统源码、…

2026/8/30 20:29:04
春招数据库笔试第二批复盘:题型解析与实战踩坑指南

春招数据库笔试第二批复盘:题型解析与实战踩坑指南

考完小满春招数据库岗第二批笔试,从考场出来那一小时,我在地铁上把整张卷子默了一遍。和第一批相比,第二批的题型分布、考点侧重点都做了明显调整,尤其是把国产数据库、向量数据库、时序数据库这些东西直接塞进了正式考题&#xf…

2026/8/30 20:29:04
2023数据库岗春招笔试复盘:从SQL到国产数据库适配的完整考点指南

2023数据库岗春招笔试复盘:从SQL到国产数据库适配的完整考点指南

2023年度小满意春招数据库岗第二批笔试复盘:考点拆解与备赛思路春招季帮一个学弟看了一套数据库岗的笔试题,题目整体不偏不怪,但覆盖面很广,从经典SQL语法到事务隔离级别、从索引优化到国产数据库生态都有涉及。这套卷子虽然是202…

2026/8/30 20:29:04
2024科大讯飞算法岗笔试复盘:机器学习与编程实战全解析

2024科大讯飞算法岗笔试复盘:机器学习与编程实战全解析

1. 笔试整体印象:今年考了什么,难度怎么样2024年秋招科大讯飞算法岗笔试,我是赶着第一波投的简历,大概在八月底就收到了笔试通知。整个笔试用的是牛客网的系统,时长120分钟,题型不算花哨,但覆盖…

2026/8/30 20:24:03