千家信息网

C++类型转换引入了那几种方式

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,这期内容当中小编将会给大家带来有关C++类型转换引入了那几种方式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。众所周知C++关于类型转换引入了四种方式:static
千家信息网最后更新 2024年11月14日C++类型转换引入了那几种方式

这期内容当中小编将会给大家带来有关C++类型转换引入了那几种方式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

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

  • static_cast

  • const_cast

  • dynamic_cast

  • reinterpret_cast

  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(f);      cout << "i " << i << endl;       int *pi = static_cast(&f);  // error invalid static_cast from type ‘float*’ to type ‘int*’     Derive d;      d.Func();      Base *b = static_cast(&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(&d);      b->Func();      Derive *dd = dynamic_cast(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(cpi);      const int *cpii = const_cast(pi);      return 0;  }

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

reinterpret_cast

使用方式:

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

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

上述就是小编为大家分享的C++类型转换引入了那几种方式了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

类型 方式 指针 场景 C++ 对象 之间 常量 语言 强制 不同 代码 函数 运行 内容 子类 篇文章 问题 分析 检查 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库自己做表分析 vs与oracle数据库 房产数据库建模 网络安全主题绘画作品初一 虚拟主机数据库如何重置 烽火r2200服务器指示灯 慧享园软件开发时间 纸鱼解说给死人玩的服务器 悟空问答提交答案时数据库错误 有哪些前沿的网络技术趋势 非洲那边做软件开发怎么样 国际求生体验服服务器爆满怎么办 软件开发税率一般多少 中国网络安全与数据保护立法趋严 办身份证指纹会进入指纹数据库吗 查看管理服务器 三级网络技术上软件序列号 工信部网络安全攻防 河南税控盘服务器地址2021 合金装备5服务器每周维护多久 教育网络安全宣传素材 网络安全隐患排查整改报告 网络安全素质与教育 数据库8111错误 谷歌云服务器删除账号 网络安全警察定义 搜一下网络安全绘画 网络安全设备厂商总代 无线路由器连接不上显示服务器 form上传文件到服务器文件夹
0