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

38.C++进阶:C++的类型转换|static_cast|reinterpret_cast|const_cast|dynamic_cast

C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。

  1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  2. 显式类型转化:需要用户自己处理
void Test () { int i = 1; // 隐式类型转换 double d = i; printf("%d, %.2f\n" , i, d); int* p = &i; // 显示的强制类型转换 int address = (int) p; printf("%x, %d\n" , p, address); }

缺陷:
转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

为什么C++需要四种类型转换

C风格的转换格式很简单,但是有不少缺点的:

  1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  2. 显式类型转换将所有情况混合在一起,代码不够清晰
    因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。

C++强制类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast

static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换

int main() { double d = 12.34; int a = static_cast<int>(d); cout<<a<<endl; return 0; }
reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型

int main() { double d = 12.34; int a = static_cast<int>(d); cout << a << endl; // 这里使用static_cast会报错,应该使用reinterpret_cast //int *p = static_cast<int*>(a); int *p = reinterpret_cast<int*>(a); return 0; }
const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值

void Test () { const int a = 2; int* p = const_cast< int*>(&a ); *p = 3; cout<<a <<endl; }
dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)
注意:

  1. dynamic_cast只能用于父类含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
class A { public : virtual void f(){} }; class B : public A {}; void fun (A* pa) { // dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回 B* pb1 = static_cast<B*>(pa); B* pb2 = dynamic_cast<B*>(pa); cout<<"pb1:" <<pb1<< endl; cout<<"pb2:" <<pb2<< endl; } int main () { A a; B b; fun(&a); fun(&b); return 0; }

注意
强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。强烈建议:避免使用强制类型转换

RTTI

RTTI:Run-time Type identification的简称,即:运行时类型识别。
C++通过以下方式来支持RTTI:

  1. typeid运算符
  2. dynamic_cast运算符
  3. decltype

常见面试

  1. C++中的4中类型转化分别是:
  2. 说说4中类型转化的应用场景。
http://www.jsqmd.com/news/329553/

相关文章:

  • 2026年黑龙江广告公司推荐:多行业场景实战评测,破解本地获客与成本控制痛点
  • 39.C++进阶:C++的IO流|标准IO流|文件IO流|stringstream
  • 谈谈 Golang 中的线程协程是如何管理栈内存的 - 实践
  • 题解:P9867 [POI 2021/2022 R2] kon
  • 37.C++进阶:特殊类设计|不能拷贝|不能继承|只在堆上创建对象|只在栈上创建对象|只能创建一个对象
  • 攻防世界-MulTzor
  • 【小程序毕设全套源码+文档】基于微信小程序的爱抚宠物小程序设计与实现(丰富项目+远程调试+讲解+定制)
  • APISIX > ai-proxy 插件 - 指南
  • 亲测好用9个降AIGC平台 千笔·降AIGC助手帮你降AI率
  • 计算机毕设Java农村住宅房屋信息管理应用系统 基于Java的农村住宅信息管理系统设计与实现 Java技术驱动的农村房屋信息管理平台开发
  • 【小程序毕设源码分享】基于springboot+小程序的爱抚宠物小程序的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 金融信创环境下,百度富文本编辑器支持哪些WORD图片粘贴的优化方案?
  • 2026最新!10个AI论文网站测评:专科生毕业论文+开题报告高效写作指南
  • 智能体的设计模式探讨
  • 【小程序毕设源码分享】基于springboot+Android家庭医务助手APP的设计与实现(程序+文档+代码讲解+一条龙定制)
  • SpringMVC中如何处理百M级别大附件的上传下载?
  • 打造国产化内网新基座:PageAdmin 助力构建新一代智慧警务网站集群
  • 农业信息化平台用百度UM编辑器导入WORD文档,如何解决图片粘贴后的排版问题?
  • 从模型到ECU:手搓BMS控制器的野路子
  • 310. Java Stream API -大小特性和子大小特性流
  • 【一句日历】2026年02月
  • 医疗系统用百度UMEDITOR导入WORD文档,如何处理粘贴的图片清晰度问题?
  • 教育网站如何通过百度UMEDITOR实现PPT课件中WORD图片的网页化展示?
  • 风、光、负荷出力各场景及概率、场景削减、负荷点的拉丁超立方抽样(Matlab代码实现)
  • 为什么有些人边框不用border属性
  • 计算机毕设Java快递仓库管理系统 基于Java的快递仓储信息化管理系统设计与实现 Java技术驱动的快递仓库智能管理平台开发
  • 苹果斥资20亿美元收购AI初创公司:准备把“耳语”变成换机杀手锏?
  • 深度测评10个降AI率工具 千笔·专业降AI率智能体高效降AIGC
  • 计算机毕设Java教研室管理系统设计与实现 基于Java技术的教研室信息管理系统开发与应用 Java环境下教研室综合管理平台的设计与实现
  • 基于peakcan/PCAN UDS上位机 (14229/15765) 可以开发UDS小工具