比较比较C++中的static_cast、dynamic_cast、reinterpret_cast类型转换方式

原创 2013年12月03日 15:05:14
类型 static_cast dynamic_cast reinterpret_cast
特点 没有运行时类型检查来保证转换的安全性 dynamic_cast运算符可以在执行期决定真正的类型
reinterpret_cast是C++里的强制类型转换符。
用法
static_cast < type-id > ( expression )
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。

dynamic_cast < type-id > ( expression )
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_caststatic_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

reinpreter_cast<type-id> (expression)
操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换
例如:int *n= new int ;
double *d=reinterpret_cast<double*> (n);
在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。
因此, 需要谨慎使用 reinterpret_cast.
static_cast 与 reinterpret_cast
reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话)


相关文章推荐

标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_c

使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 3.1 static_cast 用法:static_cas...
  • neiloid
  • neiloid
  • 2011年11月19日 23:42
  • 572

static_cast与c风格的强制类型转换比较

class A { int a; }; class B { int b; }; class C : public A { int c; }; int main() { ...
  • whatday
  • whatday
  • 2015年12月28日 10:51
  • 3063

【C++】强制类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast,explicit)

强制类型转换关闭或挂起了正常的类型检查,要慎用: (1):static_cast: static_cast用于(非多态)相关类型的转换(静态转换),即可用于编译器隐式执行的任何类型转换 int i...
  • ZDF0414
  • ZDF0414
  • 2015年10月15日 19:18
  • 343

学习: c++类型转换reinterpret_cast、 const_cast、static_cast、dynamic_cast

3.1 static_cast 用法:static_cast ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性...

标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和 const_cast

关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, d...

标准c++的类型转换符之间的区别(static_cast,dynamic_cast,const_cast,reinterpret_cast)(转载)

C 风格(C-style)强制转型如下:  (T) expression // cast expression to be of type T  函数风格(Function-style)强制转...
  • oldmtn
  • oldmtn
  • 2012年04月10日 17:46
  • 538

C++命名的强制类型转换(static_cast dynamic_cast const_cast reinterpret_cast)

cast_name(expression) 1. static_cast:任何具有明确定义的类型转换,只要不包含底层const(比如常量指针,而不是指针常量),都可以使用。常用于窄化转换(告诉程序的读...

C++中的强制类型转换(cast)——static_cast, dynamic_cast, const_cast和reinterpret_cast

static_cast, dynamic_cast, const_cast和reinterpret_cast都属于命名的强制类型转换,命名的强制类型转换符号的一般形式如下: cast...

c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast

dynamic_cast:   通常在基类和派生类之间转换时使用,run-time   cast const_cast:   主要针对const和volatile的转换.  static_cast...

C++类型转换:static_cast、const_cast、dynamic_cast、reinterpret_cast

C++类型转换包括4种:static_cast、const_cast、dynamic_cast、reinterpret_cast这四种。 static_cast: 1、静态类型转换。比如,可以将int...
  • vctrip
  • vctrip
  • 2014年01月12日 16:10
  • 277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较比较C++中的static_cast、dynamic_cast、reinterpret_cast类型转换方式
举报原因:
原因补充:

(最多只允许输入30个字)