网站服务器环境不支持mysql数据库,免费商标图案logo,wordpress文章分栏,wordpress 目录权限为什么要引入这几种类型转换#xff0c;它与C语言中的强制类型转换有什么区别#xff1f;这四种类型转换分别应用在什么场景#xff1f;C 为什么要引入这几种强制类型转换#xff1f;我们都知道C 完全兼容C语言#xff0c;C语言的转换方式很简单#xff0c;可以在任意类型… 为什么要引入这几种类型转换它与C语言中的强制类型转换有什么区别这四种类型转换分别应用在什么场景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_castint(f); cout i i endl;int *pi static_castint *(f); // error invalid static_cast from type ‘float*’ to type ‘int*’Derive d; d.Func(); base *b static_castbase *(d); b-Func(); return 0;}
使用场景基本数据类型之间的转换使用例如float转intint转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_castbase *(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_castint *(cpi);const int *cpii const_castconst int *(pi); return 0;}
使用场景用于常量指针或引用与非常量指针或引用之间的转换只有const_cast才可以对常量进行操作一般都是用它来去除常量性去除常量性是危险操作还是要谨慎操作。reinterpret_cast使用方式int main() { int data 10; int *pi data;float *fpi reinterpret_castfloat *(pi);return 0;}
使用场景没啥场景类似C语言中的强制类型转换什么都可以转万不得已不要使用一般前三种转换方式不能解决问题了使用这种强制类型转换方式。声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。