static_cast和reinterpret_cast的区别
2013-06-15 17:01
148 查看
发布时间:2009.07.07 13:25 来源:CSDN 作者:CSDN |
大多程序员在学C++前都学过C,并且习惯于C风格(类型)转换。当写C++(程序)时,有时候我们在使用static_cast<>和reinterpret_cast<>时可能会有点模糊。在本文中,我将说明static_cast<>实际上做了什么,并且指出一些将会导致错误的情况。 泛型(Generic Types)
指针类型(Pointer Types) 指针转换有点复杂,我们将在本文的剩余部分使用下面的类:
情况2:转换到相关的类
CDerived* pD = 392fb8 CBaseY* pY1 = 392fbc CDerived* pD1 = 392fb8 CBaseY* pY2 = 392fb8 CBaseY* pY3 = 390ff0 CDerived* pD3 = 390fec 注意:在将CDerived*用隐式 static_cast<>转换到CBaseY*(第5行)时,结果是(指向)CDerived*(的指针向后) 偏移了4(个字节)(译注:4为int类型在内存中所占字节数)。为了知道static_cast<> 实际如何,我们不得不要来看一下CDerived的内存布局。 CDerived的内存布局(Memory Layout) 如图所示,CDerived的内存布局包括两个对象,CBaseX 和 CBaseY,编译器也知道这一点。因此,当你将CDerived* 转换到 CBaseY*时,它给指针添加4个字节,同时当你将CBaseY*转换到CDerived*时,它给指针减去4。然而,甚至它即便不是一个CDerived你也可以这样做。 当然,这个问题只在如果你做了多继承时发生。在你将CDerived转换 到 CBaseX时static_cast<> 和 reinterpret_cast<>是没有区别的。 情况3:void*之间的向前和向后转换 因为任何指针可以被转换到void*,而void*可以被向后转换到任何指针(对于static_cast<> 和 reinterpret_cast<>转换都可以这样做),如果没有小心处理的话错误可能发生。
CDerived* pD = 392fb8 CBaseY* pY = 392fbc void* pV1 = 392fbc CDerived* pD2 = 392fbc 一旦我们已经转换指针为void*,我们就不能轻易将其转换回原类。在上面的例子中,从一个void* 返回CDerived*的唯一方法是将其转换为CBaseY*然后再转换为CDerived*。 但是如果我们不能确定它是CBaseY* 还是 CDerived*,这时我们不得不用dynamic_cast<> 或typeid[2]。 注释: 1. dynamic_cast<>,从另一方面来说,可以防止一个泛型CBaseY* 被转换到CDerived*。 2. dynamic_cast<>需要类成为多态,即包括“虚”函数,并因此而不能成为void*。 参考: 1. [MSDN] C++ Language Reference -- Casting 2. Nishant Sivakumar, Casting Basics - Use C++ casts in your VC++.NET programs 3. Juan Soulie, C++ Language Tutorial: Type Casting |
相关文章推荐
- 简单理解static_cast, dynamic_cast, reinterpret_cast和const_cast的区别和应用
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- C++中static_cast和reinterpret_cast的区别(转)
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- static_cast 和 reinterpret_cast的区别以及dynamic_cast
- static_cast和reinterpret_cast的区别
- static_cast, dynamic_cast和reinterpret_cast的区别和应用
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast的区别与比较
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别,char int *p,int const*p
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- dynamic_cast、static_cast、const_cast和reinterpret_cast的区别
- C++中static_cast、const_cast、reinterpret_cast的用法举例,附带举例说明强制类型转换时int和int&的区别
- Qt 中C++ static_cast 和 reinterpret_cast的区别(static_cast是隐式类型转换,会有数据损失,reinterpret_cast是底层二进制转换,没有数据损失)
- 区别:static _cast、dynamic _cast、reinterpret_cast和const_cast
- static_cast、dynamic_cast、reinterpret_cast和const_cast的区别与比较
- 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别