小编给大家分享一下c++中强制类型转换方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强> C中的类型转换:强>
事情要从头说起,这个头就是C语言。我们已经习惯了使用C类型转换,因为它强大而且简单。
主要有一下两种形式:
- <李>
(新型)表达式
李> <李>新型(表达式)
李>C风格的转换格式很简单,但是有不少缺点:
1。转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。
2.摄氏度风格的转换没有统一的关键字和标示符。对于大型系统,做代码排查时容易遗漏和忽略。
<强> c++中的类型转换:强>
c++风格完美的解决了上面两个问题。1。对类型转换做了细分,提供了四种不同类型转换,以支持不同需求的转换;2。类型转换有了统一的标示符,利于代码排查和检视。下面分别来介绍这四种转换:static_cast, dynamic_cast, const_cast和reinterpreter_cast。
- <李>
static_cast,命名上理解是静态类型转换。如int转换成char。
李> <李>dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。
李> <李>const_cast,字面上理解就是去const属性。
李> <李>reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。
李><强>一、static_cast转换强>
1。<>强基本用法强>:static_cast表达式
2。<强>使用场景强>:
,用于类层次结构中基类和派生类之间指针或引用的转换
上行转换(派生类——在基类)是安全的;
下行转换(基类,在派生类)由于没有动态类型检查,所以是不安全的。
b,用于基本数据类型之间的转换,如把int转换为char,这种带来安全性问题由程序员来保证
c,把空指针转换成目标类型的空指针
d,把任何类型的表达式转为无效类型
3。<强>使用特点强>
,主要执行非多态的转换操作,用于代替C中通常的转换操作
b,隐式转换都建议使用static_cast进行标明和替换
int n=6;双d=static_cast(n);//基本类型转换int * pn=, n;双* d=static_cast<双*祝辞(和n)//无关类型指针转换,编译错误void * p=static_cast <强>二,dynamic_cast转换强>
1。<>强基本用法强>:dynamic_cast表达式
2。<强>使用场景强>:只有在派生类之间转换时才使用dynamic_cast, id类型必须是类指针,类引用或者void *。
3。<强>使用特点强>:
,基类必须要有虚函数,因为dynamic_cast是运行时类型检查,需要运行时类型信息,而这个信息是存储在类的虚函数表中,只有一个类定义了虚函数,才会有虚函数表(如果一个类没有虚函数,那么一般意义上,这个类的设计者也不想它成为一个基类)。
b,对于下行转换,dynamic_cast是安全的(当类型不一致时,转换过来的是空指针),而static_cast是不安全的(当类型不一致时,转换过来的是错误意义的指针,可能造成踩内存,非法访问等各种问题)
c, dynamic_cast还可以进行交叉转换
类BaseClass {公众: int m_iNum; 虚拟空间foo(){},//基类必须有虚函数。保持多台特性才能使用dynamic_cast};类DerivedClass:公共BaseClass {公众: char * m_szName [100]; 空白栏(){}; }; BaseClass * pb=new DerivedClass (); DerivedClass * pd1=static_cast<强>三,const_cast转换强>
1。<>强基本用法强>:const_castexpression
2。<强>使用场景强>:
,常量指针转换为非常量指针,并且仍然指向原来的对象
c++中强制类型转换方法有哪些