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

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

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

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

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

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

static_cast

使用方式:

#include
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
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(b);    dd->Func();    return 0;}

使用场景:用于将父类的指针或引用转换为子类的指针或引用,此场景下父类必须要有虚函数,因为dynamic_cast是运行时检查,检查需要运行时信息RTTI,而RTTI存储在虚函数表中。

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 为什么非要引入那几种类型转换?相关推荐

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

    我们都知道C++完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向const对象的指针转换成非const对象的指针,可能将基类对象指针 ...

  2. Java异步非阻塞编程的几种方式

    简介: Java异步非阻塞编程的几种方式 一. 从一个同步的Http调用说起 一个很简单的业务逻辑,其他后端服务提供了一个接口,我们需要通过接口调用,获取到响应的数据. 逆地理接口:通过经纬度获取这个 ...

  3. es6字符串添加html标签,JavaScript_详解JavaScript ES6中的模板字符串,在 ES6 中引入了一种新的字符 - phpStudy...

    详解JavaScript ES6中的模板字符串 在 ES6 中引入了一种新的字符串字面量 - 模板字符串,除了使用反引号 (`) 表示,它们看上去和普通的字符串没有什么区别.在最简单的情况下,他们就是 ...

  4. oracle存储多少条数据类型,Oracle目前可以存储极大的对象,这是因为它引入了四种新的数据类型。其中哪一种大对象数据类型在数...

    Oracle目前可以存储极大的对象,这是因为它引入了四种新的数据类型.其中哪一种大对象数据类型在数 更多相关问题 谈谈我国幼儿教师的基本权利和义务. 请帮忙给出正确答案和分析,谢谢! 监察机关在办理监 ...

  5. CSS样式表引入的三种方式,及优先级顺序

    CSS样式表引入的三种方式,及优先级顺序 CSS可以通过三种方式引入样式表,三种方式分别是行内样式表,内部样式表和外部样式表. 行内样式表 通过给标签设定style属性 <body>< ...

  6. vue引入css三种方式

    vue引入css三种方式 1.在对应.vue文件的中引入 <script> import "@/assets/css/reset.css" </script> ...

  7. html动态加载js方法,动态引入js四种方法总结

    这次给大家带来动态引入js四种方法总结,动态引入js四种方法的注意事项有哪些,下面就是实战案例,一起来看一下. index.html test.jsalert("hello! I am te ...

  8. C++中四种类型转换方式

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a,但是c 风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型 ...

  9. 【C++】类型转换简述:四种类型转换方式的说明及应用

    本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...

最新文章

  1. 微服务领域,为什么选SpringCloud而不是Dubbo?
  2. jupyter notebook 插入图片
  3. 给UIScrollView添加category实现UIScrollView的轮播效果
  4. TDSQL“相似查询工具MSQL+”入选VLDB论文
  5. 【转载】在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库
  6. python socket 多人聊天室
  7. LintCode-- Remove Linked List Elements
  8. hive 查询是否包含字符串_oracle判断一个字符串中是否包含另外一个字符串
  9. 【Z】男人应该努力去做的
  10. win10自带抓包工具_[教程] 利用抓包工具从Windows 10 应用商店里下载应用程序离线安装包...
  11. Java案例:功夫熊猫
  12. Notepad++实现verilog语法检查
  13. java-获取电池电量
  14. 简单学JAVA-Java学习方法-费曼学习法
  15. 【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享
  16. 怎么把视频转成mp3音频,下面有四个方法
  17. EMC电磁兼容1:EMC、EMI、EMS是什么?它们之间有什么关系?
  18. Pop!_OS版机器人仿真实践镜像测试中(2021)
  19. 夜深忽梦少年事,7年又一年,来看看95年那个小伙现在怎么样了
  20. Field xxxMapper in xxxxxxx required a bean of type ‘xxxxMapper‘that could not be found.

热门文章

  1. Java 8 map(),flatMap()示例
  2. 基本服务-使用大使网关
  3. 谁最终需要Java模块?
  4. jaxb入门_JAXB教程–入门
  5. 注意Java 8的[Pri​​mitive] Stream.iterate()中的递归
  6. 使用JUnit规则进行干净的集成测试
  7. hadoop伪分布式模式_Hadoop模式介绍-独立,伪分布式,分布式
  8. JLupin Next Server乍一看
  9. 从浏览器端JavaScript代码进行服务器端日志记录
  10. jQuery Ajax – Servlets集成:构建完整的应用程序