首页 > 后端开发 > C++ > 正文

c++中的类型转换有哪几种_c++ static_cast, dynamic_cast, const_cast用法【安全】

尼克
发布: 2025-12-18 18:09:50
原创
311人浏览过
C++类型转换分隐式和显式两类,显式含static_cast(安全常用)、dynamic_cast(多态下行安全)、const_cast(调整cv限定符)和危险的reinterpret_cast。

c++中的类型转换有哪几种_c++ static_cast, dynamic_cast, const_cast用法【安全】

C++ 中的类型转换分为隐式转换和显式转换两大类,显式转换又细分为四种 命名强制转换(named cast):`static_cast`、`dynamic_cast`、`const_cast` 和 `reinterpret_cast`。其中前三种在日常开发中较常用且相对安全,而 `reinterpret_cast` 风险极高,应尽量避免。

static_cast:最常用的安全转换

用于有明确逻辑关系的类型间转换,编译期检查,不涉及运行时开销。适合以下场景:

  • 基本类型之间转换(如 int → doubledouble → int),但会丢失精度或截断,需开发者自行负责
  • 派生类指针/引用 → 基类指针/引用(上行转换),安全且推荐
  • 基类指针/引用 → 派生类指针/引用(下行转换),仅当确定对象实际类型时才可用,否则行为未定义(不安全!)
  • 枚举 ↔ 整型(需注意底层类型匹配)
  • 调用自定义类型转换函数(如 operator double())

示例:

double d = 3.14;<br>
int i = static_cast<int>(d); // 合理,但截断小数<br>
Base* b = new Derived;<br>
Derived* d_ptr = static_cast<Derived*>(b); // 可行,但若 b 实际不是 Derived 就崩溃
登录后复制

dynamic_cast:唯一支持运行时类型检查的转换

专用于多态类型的指针或引用的下行转换(基类 → 派生类),要求基类至少有一个虚函数(即支持 RTTI)。转换失败时:

  • 对指针返回 nullptr
  • 对引用抛出 std::bad_cast 异常

这是 最安全的下行转换方式,代价是轻微运行时开销。

芝士饼
芝士饼

芝士饼是一个一站式AI原生应用开发平台,简单几步即可完成应用的创建与发布。

芝士饼 92
查看详情 芝士饼

立即学习C++免费学习笔记(深入)”;

示例:

Base* b = new Base;<br>
Derived* d = dynamic_cast<Derived*>(b); // 返回 nullptr,不会崩溃<br>
if (d) { /* 安全使用 */ }
登录后复制

const_cast:唯一能修改 cv-qualifier 的转换

仅用于添加或移除 constvolatile 限定符,其他任何改动都会导致未定义行为。

  • 常见用途:调用只接受非 const 参数的旧式 C 函数,而你手头只有 const 对象(需确保函数内部确实不修改数据)
  • 不能用于去除 const 后去修改原本就是 const 的对象,例如 const int x = 5; int* p = const_cast(&x); *p = 10; → 未定义行为

示例:

void legacy_func(char* s);<br>
const std::string s = "hello";<br>
legacy_func(const_cast<char*>(s.c_str())); // OK,前提是 legacy_func 不写入
登录后复制

基本上就这些。优先用 `static_cast`,涉及继承体系下行转换时用 `dynamic_cast`,仅当必须调整 const 性时才用 `const_cast`。`reinterpret_cast` 应视为“最后手段”,通常只出现在底层系统编程或与硬件/ABI 交互的场景中。

以上就是c++++中的类型转换有哪几种_c++ static_cast, dynamic_cast, const_cast用法【安全】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号