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

本文转载自微信公众号「程序喵大人」,作者程序喵大人 。转载本文请联系程序喵大人公众号。

创新互联主要从事做网站、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务兴山,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575

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

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

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

为什么要引入这几种类型转换,它与C语言中的强制类型转换有什么区别?

这四种类型转换分别应用在什么场景?

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

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

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

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

 
 
 
  1. static_cast 

使用方式:

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

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

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

 
 
 
  1. dynamic_cast 

使用方式:

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

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

 
 
 
  1. const_cast 

使用方式:

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

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

 
 
 
  1. reinterpret_cast 

使用方式:

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

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

新闻名称:C++为什么非要引入那几种类型转换?
文章分享:http://www.mswzjz.cn/qtweb/news10/15610.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能