四川住房和城乡建设部官方网站,企业整合营销系统,ssl 加密网站,企业app定制开发1.什么是类型转换 在传统C语言中#xff0c;由强制类型转换和隐式类型转换#xff0c;隐式类型转换#xff0c;编译器在在编译阶段自动处理#xff0c;能转换则转换#xff0c;强制类型转换由用户自己转换。 缺陷#xff1a; 转换的可视性比较差#xff0c;所有的转换形…1.什么是类型转换 在传统C语言中由强制类型转换和隐式类型转换隐式类型转换编译器在在编译阶段自动处理能转换则转换强制类型转换由用户自己转换。 缺陷 转换的可视性比较差所有的转换形式都是以一种相同形式书写难以跟踪错误的转换隐式类型转化有些情况下可能会出问题比如数据精度丢失显式类型转换将所有情况混合在一起代码不够清晰 比如 int a 100; long long b a;//隐式类型转换 char c b;//隐式类型转换 size_t d a;//隐式类型转换 cout a b c d endl; //强制类型转换 double e (double)a; float f (double)e; cout e f endl; 在C中也可以使用C语言的转换方式但在C中有自己的转换方式
标准C为了加强类型转换的可视性引入了四种命名的强制类型转换操作符 static_cast、reinterpret_cast、const_cast、dynamic_cast
2.不同操作符使用场景
2.1 static_cast使用
在static_cast中它的使用方法相对于C语言中的隐式类型转换只能转换两种类型比较接近的不能用于不相干类型的转换。
比如 int a 100; char b static_castchar(a); //char* c static_castchar*(a);//无法转换 cout b endl; 2.2 reinterpret_cast使用
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释强制转换两种不相关的类型即一种类型转换为另一种不相干的类型,
比如 int a 100; char b static_castchar(a); char* c static_castchar(b);//无法转换 char* c reinterpret_castchar*(b); printf(%c\n, *(c)); 2.3 const_cast使用
const_cast最常用的用途就是删除变量的const属性方便赋值但是需要使用volatile修饰加了const的变量。
比如 volatile const int a 10; int* p const_castint*(a); p (int*)a; *p 20; cout *p a endl; 2.4 dynamic_cast使用方法
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
向上转型子类对象指针/引用-父类指针/引用(不需要转换赋值兼容规则)
向下转型父类对象指针/引用-子类指针/引用(用dynamic_cast转型是安全的) 注意 1. dynamic_cast只能用于父类含有虚函数的类 2. dynamic_cast会先检查是否能转换成功能成功则转换不能则返回0 比如 class A { public: virtual void f() {} }; class B : public A {}; //A*指针有可能指向父类也有可能指向子类 void fun(A* pa) { // dynamic_cast会先检查是否能转换成功能成功则转换不能则返回 // 如果pa是指向子类那么可以转换转换表达式返回正确的地址 // 如果pa是指向父类那么不能转换转换表达式返回nullptr B* pb1 static_castB*(pa); B* pb2 dynamic_castB*(pa);//返回空 cout pb1: pb1 endl; cout pb2: pb2 endl; } int main() { //父类对象无论如何都不能转换为子类 A a; B b; fun(a); fun(b); return 0; } 注意 强制类型转换关闭或挂起了正常的类型检查每次使用强制类型转换前程序员应该仔细考虑是 否还有其他不同的方法达到同一目的如果非强制类型转换不可则应限制强制转换值的作用 域以减少发生错误的机会。强烈建议避免使用强制类型转换。