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必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换为一个整数,也可以把一个整数转换为一个指针(先把一个指针转换为一个整数,再把该整数转换为原来类型的指针,还可以得到原来的指针值)。

 

用法: 

操作符修改了操作数类型后,仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。---》危险

举个栗子:

 

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

posted @ 2019-12-18 14:53  JaimeJie  阅读(5597)  评论(0)    收藏  举报