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

 更新时间:2021年03月12日 08:33:11   投稿:zx  
这篇文章主要介绍了C++为什么非要引入那几种类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

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

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

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

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

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

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

static_cast

使用方式:

#include <iostream> 
using namespace std; 
struct Base { 
  virtual void Func() { cout << "Base Func \n"; } 
}; 
struct Derive : public Base { 
  void Func() override { cout << "Derive Func \n"; } 
}; 
int main() { 
  float f = 1.23; 
  cout << "f " << f << endl; 
  int i = static_cast<int>(f); 
  cout << "i " << i << endl;  
  int *pi = static_cast<int *>(&f); // error invalid static_cast from type ‘float*' to type ‘int*' 
  Derive d; 
  d.Func(); 
  Base *b = static_cast<Base *>(&d); 
  b->Func(); 
  return 0; 
} 

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

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

dynamic_cast

使用方式:

#include <iostream> 
using namespace std; 
struct Base { 
  virtual void Func() { cout << "Base Func \n"; } 
}; 
struct Derive : public Base { 
  void Func() override { cout << "Derive Func \n"; } 
}; 
int main() { 
  Derive d; 
  d.Func(); 
   Base *b = dynamic_cast<Base *>(&d); 
  b->Func(); 
   Derive *dd = dynamic_cast<Derive *>(b); 
  dd->Func(); 
  return 0; 
} 

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

const_cast

使用方式:

int main() { 
  int data = 10; 
  const int *cpi = &data; 
  int *pi = const_cast<int *>(cpi); 
  const int *cpii = const_cast<const int *>(pi); 
  return 0; 
} 

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

reinterpret_cast

使用方式:

int main() { 
  int data = 10; 
  int *pi = &data; 
  float *fpi = reinterpret_cast<float *>(pi); 
  return 0; 
} 

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

到此这篇关于C++为什么非要引入那几种类型转换的文章就介绍到这了,更多相关C++ 类型转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言 指针与二维数组详解

    C语言 指针与二维数组详解

    本文主要介绍C语言 指针与二维数组,这里整理了详细的资料及示例代码,有需要的小伙伴可以参考下
    2016-08-08
  • C++使用string的大数除法运算(4)

    C++使用string的大数除法运算(4)

    这篇文章主要为大家详细介绍了C++使用string的大数除法运算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 详解设计模式中的中介者模式在C++编程中的运用

    详解设计模式中的中介者模式在C++编程中的运用

    这篇文章主要介绍了设计模式中的中介者模式在C++编程中的运用,中介者模式将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性,需要的朋友可以参考下
    2016-03-03
  • C++设计模式编程之Flyweight享元模式结构详解

    C++设计模式编程之Flyweight享元模式结构详解

    这篇文章主要介绍了C++设计模式编程的Flyweight享元模式结构,享元模式在实现过程中主要是要为共享对象提供一个存放的"仓库"(对象池),需要的朋友可以参考下
    2016-03-03
  • C语言经典例程100例(经典c程序100例)

    C语言经典例程100例(经典c程序100例)

    这篇文章主要介绍了C语言经典例程100例,经典c程序100例,学习c语言的朋友可以参考一下
    2018-03-03
  • C++类继承时的构造函数

    C++类继承时的构造函数

    这篇文章主要介绍了C++类继承时的构造函数,C++中,子类继承父类除去构造函数和析构函数以外的所有成员。因此,子类需要编写自己的构造函数和析构函数。更多相关详情需要的小伙伴可以参考下面文章介绍
    2022-03-03
  • C++面试八股文之STL标准模板库使用详解

    C++面试八股文之STL标准模板库使用详解

    这篇文章主要为大家介绍了C++面试八股文之STL标准模板库使用详解,<BR>有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 使用devenv在命令行中编译项目的方法

    使用devenv在命令行中编译项目的方法

    下面小编就为大家分享一篇使用devenv在命令行中编译项目的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • QT判断两个日期时间的大小

    QT判断两个日期时间的大小

    本文主要介绍了QT判断两个日期时间的大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用Qt实现获取本机IP和定位

    使用Qt实现获取本机IP和定位

    这篇文章主要为大家详细介绍了如何使用Qt实现获取本机IP和定位,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11

最新评论