【c++】c语言入门到c++使用高手:深入学习C++之基本语言(十)

发布时间:2026/10/23 4:03:26
【c++】c语言入门到c++使用高手:深入学习C++之基本语言(十) 第二章 基本语言第十节 类型转换static_cast、reinterpret_cast等1.隐式类型转换系统自动进行,不需要程序开发人员介入#includeiostreamusing namespace std;intmain(){// 把小数部分截掉,隐式类型转换inta346.6;floatb346.6;couta bendl;return0;}2. 显式类型转换(强制类型转换)#includeiostreamusing namespace std;intmain(){// int k 5 % 3.2;语法错误// c语言风格的强制类型转换intk5%(int)3.2;// 函数风格的强制类型转换(c语言风格的强制类型转换)intk15%int(3.2);return0;}c强制类型转换分为四种,这4种强制类型转换,分别用于不同的目的,提供4种的目的,提供更丰富的含义和功能,更好的类型检查static_cast, dynamic_cast, const_cast, reinterpre_cast,这4种强制类型转换都被称呼为命名的强制类型转换,因为它们每个都有一个名字并且名字各不相同通用形式: 强制类型转换名(express), 强制类型转换名,是上边的四种名字, type:转换的目标类型,express:需要转换的值2.1 static_cast-静态转换, 正常转换,编译的时候就会进行类型转换的检查,代码中要保证转换的安全性和正确性,static_cast含义跟c语言中强制类型转换这种差不多, c风格的强制类型转换以及编译器能够进行的隐式类型转换,都可以用static_cast来显示完成可用场景相关类型转换:整型和实型之间doublef100.34finti(int)f;inti2static_castint(f);//c风格的类型转换后续学习类的时候子类转成父类类型(继承关系),也能用这个static_cast转#includeiostreamusing namespace std;// 父类class A{};// 子类, 公有继承父类class B:public A{};intmain(){B b;// 把子类转成父类的对象A astatic_castA(b);return0;}void*与其他类型指针之间的转换,void*:无类型指针,可以指向任何指针(万能指针)#includeiostreamusing namespace std;intmain(){inti10;int*pi;// int* 转成 void*void*qstatic_castvoid*(p);int*dbstatic_castint*(q);return0;}不可使用场景一般不能用于指针类型的转换,比如int *转double *, float *转double *等等#includeiostreamusing namespace std;intmain(){doublef100.0f;double*pff;//会报错,方案不可行// int *i static_castint*(pf);return0;}2.2 dynamic_cast主要应用于运行时类型识别和检测,主要用来父类型和子类型转换用的,(父类型指针指向子类型对象,用dynamic_cast把父类型指针把子指针类型转,第三章会详细讲解)2.3 const_cast去除指针或者引用的const属性,该转换能够将const性质转换掉,编译时就会进行类型转换#includeiostreamusing namespace std;intmain(){constintai90;// 不可行, ai不是指针也不是引用//int ai2 const_castint(ai);constint*paiai;int*pai2const_castint*(pai);// 语法正确,这种写值行为是一种未定义行为, 还是尽量不要着这么做*pai2100;coutaiendl;//90cout*paiendl;//100cout*pai2endl;//100return0;}2.4 reinterpre_cast编译的时候就会进行类型转换的检查reinterpre_cast: 重新解释,将操作数内容解释为另外一种不同的类型(能把操作的类型都转了),处理无关类型的转换,也就是两个转换类型之间没有什么关系,就等于自由乱转,很随意常用于如下转换类型将一个整型(地址)转换成指针, 一种类型指针转换成另一种类型指针,按照转换后的内容重新解释内存中的内容也可以从一个指针类型转换成一个整型范例一#includeiostreamusing namespace std;intmain(){inti88;int*pii;int*p2reinterpret_castint*(pi);char*p3reinterpret_castchar*(pi);cout*p2endl;// 88cout*p3endl;// Xreturn0;}范例二#includeiostreamusing namespace std;intmain(){inti88;int*pii;void*p2reinterpret_castvoid*(pi);// 一些操作int*p3reinterpret_castint*(p2);cout*p3endl;// 88return0;}功能上非常强大,但是使用起来非常危险,安全性比较差任意转,这段代码意义不大…#includeiostreamusing namespace std;intmain(){inti88;longlonglv188888888888;// 16进制输出couthexlv1endl;// c风格int*piv1(int*)i;coutpiv1endl;int*piv2reinterpret_castint*(lv1);coutpiv2endl;return0;}3. 总结强制类型转换不是必须,不建议使用,强制类型转换能够抑制编译器报错,尽量少用学习的目的:认识这些类型转换符,方便大家阅读别人代码资料说: reinterpret_cast非常危险,使用const_cast意味着设计缺陷如果要使用类型转换,不要再使用c语言风格的类型转换,使用c中的类型转换即可一般使用static_cast和reinterpret_cast就能够很好的取代c语言风格的类型转换reinterpret_cast只要好好用,合乎规则的用,不乱用,还是很好用的

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询