大家好,我是程序喵,今天我们放松下,看一些类型转换的知识点!
众所周知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语言中的强制类型转换,什么都可以转,万不得已不要使用,一般前三种转换方式不能解决问题了使用这种强制类型转换方式。
操作场景 本节为您介绍通过控制台提供的CloudShell登录云服务器的操作步骤。 登...
TOP云 (west.cn)6月1日消息,今年4月份,三字母 域名 LPL.cn在国内平台一口价1...
2021腾讯广告算法大赛报名入口: https://algo.qq.com/index.html?rfisource=TIC...
在分布式系统和实时数据处理中,流处理是十分重要的技术。在数据密集型应用中,...
前面跟小伙伴们分享了 SpringMVC 一个大致的初始化流程以及请求的大致处理流程,...
区块链这把火已经蔓延到全球多个国家和地区,而从各类报道的消息来看,和区块链...
本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划。如果没有,...
本文转载自微信公众号「石杉的架构笔记」,作者崔皓。转载本文请联系石杉的架构...
如何在 云服务器 上搭建ftp?根据之前网络上的分型,用户可以先安装vsftpd软件,...
本文转载自微信公众号「JAVA前线」,作者IT徐胖子 。转载本文请联系JAVA前线公众...