C++中四种强制转换

xiaoxiao2021-02-28  4

一、简介

C++中存在四种强制类型转换,分别是static_cast 、const_cast 、 dynamic_cast 、reinterpret_cast

二、存在原因

我们直到在C语言中有强制类型转换,可以转换成合理的类型,那么我们为什么要在C++中引入四种强制类型转化的概念呢?

由于新类型的强制类型转换可以提供更好的强制控制转换过程,一旦当程序员使用了四种强制类型转换,其他的人读程序的时候可以立刻知道这个强制转换的目的是什么,方便了我们的阅读。C语言的强制类型转换难定位到所有使用强制类型转换的语句。

三、强制类型转换的分类

(1)static_cast (静态转换)

表达式为 : static_cast (expression)

运算符把expression转换为type-id类型,当我们需要在内置类型中相互转换的时候,就可以使用static_cast,即任何标准转换都可以使用它,但是在运行的过程中没有检查和保证转换的安全性(显示告诉编译器,不关心转换后的精度损失)。

它的用法主要有以下三个:

用于基本类型之间的转换。 int i; float f = 31.4; i = static_cast<int>(f); 不能用于基本类型指针之间的转换。 int i = 1; char c = 'a'; int* p = &i; char* pc =&c; pc = static_cast<char*>(p);//错误 用于有继承关系类对象之间的转换和类指针之间的转换 class A { }; class B :public A { }; class C { }; int main() { A* a = new A; B* b; C* c; b = static_cast<B*>(a); c = static_cast<C*>(c);//此句会出错 }

注意:

如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。


(2)const_cast

表达式为:const_cast (expression)

此表达式主要用来删除变量的const属性强制类型转换的目标类型必须是指针或者引用

(3)dynamic_cast

表达式为:dynamic_cast (expression)

主要用来将基类的指针和引用安全的转化为派生类的指针或者应用。

转化分两类:

向上转换

即派生类指针或引用类型转换为其基类类型,无论是指针还是引用向上转换都是安全的。

向下转换

对于“向下转型”有两种情况:

一种是基类指针所指对象是派生类类型的,这种转换是安全的;基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0; 在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常。

特点:

用于有继承关系的指针间的转换用于有交叉关系的类指针间的转换具有类型检查的功能(转换不成功返回NULL)含有虚函数的类(定义的类中必须要有虚函数) #include<iostream> using namespace std; class Base { public: Base() {}; virtual void Show() { cout << "This is Base calss"; } }; class Derived :public Base { public: Derived() {}; void Show() { cout << "This is Derived class"; } }; int main() { //这是第一种情况 Base* base = new Derived; if (Derived *der = dynamic_cast<Derived*>(base)) { cout << "第一种情况转换成功" << endl; der->Show(); cout << endl; } //这是第二种情况 Base * base1 = new Base; if (Derived *der1 = dynamic_cast<Derived*>(base1)) { cout << "第二种情况转换成功" << endl; der1->Show(); } else { cout << "第二种情况转换失败" << endl; } delete(base); delete(base1); return 0; }

注意:

dynamic_cast在转换之前会进行检查,如果转换失败指针返回,应用抛出bad_cast异常。

(4)reinterpret_cast

用于指针类型间的强制转换用于整数和指针类型间的强制转换 #include<iostream> using namespace std; int main() { int a = 10; int *i = &a; long pc = reinterpret_cast<long>(i);//把一个指针转换为一个整数,即取出地址值 char *str = reinterpret_cast<char *>(i);//把int*转换为char *(比int型小),无输出 long *l = reinterpret_cast<long *>(i);//把int *转换为long *(比int型大),取出地址值(即i值)输出 cout << *i << endl; cout << hex << pc << endl; cout << i << endl; cout << "char:" << str << endl; cout << l << endl; return 0; }

注意

reinterpret_cast不能用于非指针类型的转换。

四、总结

基本类型转换用static_cast。

去const属性用const_cast。

多态类之间的类型转换用daynamic_cast。

不同类型的指针类型转换用reinterpreter_cast。

转载请注明原文地址: https://www.6miu.com/read-2349961.html

最新回复(0)