当前位置: 首页 > 科技观察

为什么C++必须引入那些类型的转换?_0

时间:2023-03-18 13:16:41 科技观察

大家好,我是程序喵,今天就来放松一下,看看关于类型转换的一些知识点吧!众所周知,C++引入了四种类型转换方式:static_castconst_castdynamic_castreinterpret_cast为什么要引入这几种类型转换,它和C语言中的强制类型转换有什么区别?这四种类型的转换适用于哪些场景?为什么C++引入这些类型的强制转换?我们都知道C++是完全兼容C语言的。C语言的转换方法很简单,可以在任意类型之间进行转换,但这也是一个缺点,因为它极不安全,有可能不经意间将指向const对象的指针转换为非const对象。对象的指针可以将基类对象的指针转换为派生类对象的指针。这种转换很容易出现bug,需要对代码进行严格review,消除这种隐患。但是C的转换方式不利于我们对代码的审查,而且程序运行时也可能会出现bug。C++引入的这些类型的类型转换可以完美解决上述问题。针对不同场景的不同需求采用不同类型的转换方式,也有利于代码审查。下面详细介绍这四种转换的使用场景:override{cout<<"DeriveFunc\n";}};intmain(){floatf=1.23;cout<<"f"<(f);cout<<"i"<(&f);//errorinvalidstatic_castfromtype'float*'totype'int*'Derived;d.Func();Base*b=static_cast(&d);b->Func();return0;}使用场景:基本数据类型之间的转换,如float转int,int转char等,类型化指针与void*之间的转换,子类对象指针转换为a父类对象指针也可以使用static_cast。非多态类型转换一般使用static_cast,最好使用static_cast来显式替换所有隐式类型转换,static_cast不能用于类型化指针之间的类型转换。如何使用dynamic_cast:#includeusingnamespacestd;structBase{virtualvoidFunc(){cout<<"BaseFunc\n";}};structDerive:publicBase{voidFunc()override{cout<<"DeriveFunc\n";}};intmain(){Derived;d.Func();Base*b=dynamic_cast(&d);b->Func();Derive*dd=dynamic_cast(b);dd->Func();return0;}使用场景:用于将父类的指针或引用转换为子类的指针或引用。在这种场景下,父类必须有一个虚函数,因为dynamic_cast是一个运行时检查,而这个检查需要运行时信息RTTI,而RTTI是存放在虚函数表中的。关于虚函数表的详细介绍可以看我的文章:面试系列C++对象布局const_cast用法:intmain(){intdata=10;constint*cpi=&data;int*pi=const_cast(cpi);constint*cpii=const_cast(pi);return0;}使用场景:用于常量指针或引用与非常量指针或引用之间的转换,只有const_cast才能对常量进行操作,一般用于去除常量.去除常量是一项危险的操作,因此应谨慎操作。reinterpret_cast的使用方法:intmain(){intdata=10;int*pi=&data;float*fpi=reinterpret_cast(pi);return0;}使用场景:无场景,类似于C语言中的强制类型转换,什么都可以转,不到万不得已不要用,一般前三种转换方式解决不了问题,就用这种强制类型转换方式。