文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++为什么非要引入那几种类型转换?

2024-12-03 10:02

关注

 大家好,我是程序喵,今天我们放松下,看一些类型转换的知识点!

众所周知C++关于类型转换引入了四种方式:

  1.  为什么要引入这几种类型转换,它与C语言中的强制类型转换有什么区别?
  2.  这四种类型转换分别应用在什么场景?

C++为什么要引入这几种强制类型转换?

我们都知道C++完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向const对象的指针转换成非const对象的指针,可能将基类对象指针转成了派生类对象的指针,这种转换很容易出bug,需要严格审查代码才能消除这种隐患,但是C这种转换方式不利于我们审查代码,且程序运行时也可能会出bug。

而C++引入的这几种类型转换可以完美的解决上述问题,不同场景下不同需求使用不同的类型转换方式,同时有利于代码审查。

下面详细介绍这四种类型转换的使用场景:

static_cast

使用方式: 

  1. #include <iostream>  
  2. using namespace std;  
  3. struct Base {  
  4.     virtual void Func() { cout << "Base Func \n"; }  
  5. }; 
  6. struct Derive : public Base {  
  7.     void Func() override { cout << "Derive Func \n"; }  
  8. };  
  9. int main() {  
  10.     float f = 1.23;  
  11.     cout << "f " << f << endl 
  12.     int i = static_cast<int>(f);  
  13.     cout << "i " << i << endl  
  14.     int *pi = static_cast<int *>(&f);  // error invalid static_cast from type ‘float*’ to type ‘int*’ 
  15.     Derive d;  
  16.     d.Func();  
  17.     Base *b = static_cast<Base *>(&d);  
  18.     b->Func();  
  19.     return 0;  

使用场景:基本数据类型之间的转换使用,例如float转int,int转char等,在有类型指针和void*之间转换使用,子类对象指针转换成父类对象指针也可以使用static_cast。

非多态类型转换一般都使用static_cast,而且最好把所有的隐式类型转换都是用static_cast进行显示替换,不能使用static_cast在有类型指针之间进行类型转换。

dynamic_cast

使用方式: 

  1. #include <iostream>  
  2. using namespace std;  
  3. struct Base {  
  4.     virtual void Func() { cout << "Base Func \n"; }  
  5. };  
  6. struct Derive : public Base {  
  7.     void Func() override { cout << "Derive Func \n"; }  
  8. };  
  9. int main() {  
  10.     Derive d; 
  11.     d.Func(); 
  12.      Base *b = dynamic_cast<Base *>(&d);  
  13.     b->Func(); 
  14.      Derive *dd = dynamic_cast<Derive *>(b);  
  15.     dd->Func();  
  16.     return 0;  

使用场景:用于将父类的指针或引用转换为子类的指针或引用,此场景下父类必须要有虚函数,因为dynamic_cast是运行时检查,检查需要运行时信息RTTI,而RTTI存储在虚函数表中,关于虚函数表具体可以看我的这篇文章:面试系列之C++的对象布局

const_cast

使用方式: 

  1. int main() {  
  2.     int data = 10 
  3.     const int *cpi = &data;  
  4.     int *pi = const_cast<int *>(cpi);  
  5.     const int *cpii = const_cast<const int *>(pi);  
  6.     return 0;  

使用场景:用于常量指针或引用与非常量指针或引用之间的转换,只有const_cast才可以对常量进行操作,一般都是用它来去除常量性,去除常量性是危险操作,还是要谨慎操作。

reinterpret_cast

使用方式: 

  1. int main() {  
  2.     int data = 10 
  3.     int *pi = &data;  
  4.     float *fpi = reinterpret_cast<float *>(pi);  
  5.     return 0;  

使用场景:没啥场景,类似C语言中的强制类型转换,什么都可以转,万不得已不要使用,一般前三种转换方式不能解决问题了使用这种强制类型转换方式。 

 

来源:C语言与C++编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯