C++四种类型转换方式详解
一、C强制类型转换
格式: TYPE a = (TYPE) b;
缺点: 1.多个转换之后无法查找具体的转换类型,即转换不明确;
2.不能进行错误检查,容易出错。
二、C++四种类型转换方式:
(一)、const_cast
简介: const_cast是一个基于C语言编程开发的运算方法,其主要作用是:修改类型的const或volatile属性。使用该运算方法可以返回一个指向非常量的指针(或引用),就可以通过该指针(或引用)对他的数据成功元任意改变。
格式: type-id a = const_cast <type-id>( expression )
说明:上述格式中,除了const或volatile修饰之外,type_id和expression的类型是一样的。(1).常量指针被转换成非常量指针,并且仍然指向原来的对象; (2).常量引用被转换为非常量的引用,并且仍然指向原来的对象。(3).const_cast一般用于修改形如const char *p指针。
用法:

说明: volatile和const类似。
(二)、static_cast
简介: static_cast 是一个C++运算符,功能是把一个表达式转换为某种类型,但没有运行时类型检查来保证传唤的安全性。
格式: type-id a = static_cast <type-id>( expression )
用法:
1.用于类层次结构中基类(父类)和派生类(子类)之间的指针或引用的和转换。进行向上转换(将派生类的指针或引用转换成基类表示)是安全的;进行向下转换(将基类指针或者引用转换为派生类表示)时,由于没有动态类型的检查,所以是不安全的。

2.用于基本数据类型之间的转换,如把int转换为char,把int转换为enum。这种转换的安全性也要开发人员来保证。

3.把空指针转换成目标类型的空指针。

4.把任何类型的表达式转换为void类型。

注意事项: static_cast 不能转换掉expression的const、volatile或者__unaligned属性。
(三)、dynamic_cast
简介: dynamic_cast是将一个基类对象指针(或引用)转换到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。dynamic_cast运算符涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系,所以不能完全的使用传统的替换方式来代替。但是也因此它最常用,是最不可缺少的一个运算符。
格式: type-id a = dynamic_cast<type-id>( expression )
说明:该运算符把expression转换成type-id类型的对象。Type-id 必须是类的指针、类的引用或者void*;如果 type-id 是类指针类型,那么expression也必须是一个指针,如果 type-id 是一个引用,那么 expression 也必须是一个引用。dynamic_cast运算符可以再执行期决定真正的类型。如果downcast是安全的(也就是说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(即基类指针或者引用没有指向一个派生类对象)。--->此部分来源于百度
用法:
1.dynamic_cast在类层次间进行向上转换时,效果和static_cast一样。
2.dynamic_cast在类层次间进行向下转换时,具有类型检查功能,更安全。

说明: Parent类一定要有虚函数,否则会编译出错;static_cast没有这个限制。
C++面向对象的思想中,虚函数是实现多态的必要路径,如果一个类有虚函数,则编译器会构建出一个虚函数表(virtual method table)来指示这些函数的地址,如果之类中重写了该虚函数,则虚函数表会将该函数指向新的地址。如果基类有虚函数表,子类会自动继承该表。另外:如果要用继承,那么一定要让析构函数是虚函数;如果一个函数时虚函数,那么在子类中也要是虚函数。
3.dynamic_cast的交叉转换。

说明: 对于单继承和多继承来说 : 单继承中,Base* pD = new Derived1;,可以用dynamic_cast和static_cast转换pd为Derived1;如果是多继承,Derived1继承Base和Base1,则只能用dynamic_cast将pd转换为Base1类型。
(四)、reinterpret_cast
简介: reinterpret_cast,是C++里强制类型转换符。
格式: type-id a = reinterpret_cast<type-id>( expression )
说明:上述格式中,type_id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换为一个整数,也可以把一个整数转换为一个指针(先把一个指针转换为一个整数,再把该整数转换为原来类型的指针,还可以得到原来的指针值)。
用法:
操作符修改了操作数类型后,仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。---》危险
举个栗子:

说明: 该篇文章中部分理论来源于度娘。

浙公网安备 33010602011771号