C++强制类型转换
在C语言中,强制类型转换是直接使用()
的方式,这种转换方式是有安全隐患的,隐患发生时,也不易排查,在C++中,引入了四个新的关键字,来支持强制类型转换,语法形式均为
xxx_cast<newType>(data)
static_cast
静态转换,在编译时即进行转换,转换失败在编译时就会报错,类似于C语言的强制转换方式
- 可用于基本数据类型之间的转换
int n = 100; char ch = static_cast<char>(n);
- 可用于类的向上转型,但不要用于向下转型,这是不安全的!!!
class Base{}; class Child : public Base{}; //派生类转基类,这种方式是安全的,推荐使用 Child *pChild = new Child(); Base *pBase = static_cast<Base*>(pChild); //基类转派生类,这种方式是不安全的!!! Base *pBase = Base(); Child *pChild = static_cast<Child*>(pBase);
dynamic_cast
动态转换,运行时进行检查,如果转型不成功,会返回一个空指针
- 基类必须具有虚函数,因为运行时依赖RTTI进行检查,而它又与虚函数表紧密联系
- 使用该方式,会有额外的函数开销
- 基类指针或引用转派生类时,必须使用此方式
class Base{ virtual func() = 0; }; class Child : public Base{ virtual func() {} }; Base *pBase = Base(); Child *pChild = dynamic_cast<Child*>(pBase); if(pChild) { // }
const_cast
常用来去掉表达式的const
或volatile
修饰
const int n = 100; int *p = const_cast<int *>(&n);
reinterpret_cast
据说使用风险很高,还没有研究
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结