77范文网 - 专业文章范例文档资料分享平台

关于C++中的类型转换操作符(2)

来源:网络收集 时间:2019-06-11 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的(C++编程思想中的原话)。将static_cast和reinterpret_cast对比一下进行解释,比较容易理解:static_cast 和 reinterpret_cast 操作符修改了操作数类型,但是reinterpret_cast 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。例如:

int n=9;

double d=static_cast(n);

上面的例子中, 我们将一个变量从int转换到double。这些类型的二进制表达式是不同的,所以将整数9转换到双精度整数9,static_cast需要正确地为双精度整数d补足比特位。其结果为 9.0。而reinterpret_cast 的行为却不同:

int n=9;

double d=reinterpret_cast(n);

这里, 和static_cast不同,在进行计算以后, d包含无用值。这是因为reinterpret_cast仅仅是复制n的比特位到d, 没有进行必要的分析.

因此, 需要谨慎使用 reinterpret_cast。

[举例]

这个例子,将static_cast和reinterpret_cast对比进行测试,具体的输出参见其中的注释。

1 #include

2 using std::cout;

3 using std::endl;

4 class CBaseX

5 {

6 public:

7 int x;

8 CBaseX() { x = 10; }

9 void foo() { printf(\

10 };

11 class CBaseY

12 {

13 public:

14 int y;

15 int* py;

16 CBaseY() { y = 20; py = &y; }

17 void bar() { printf(\

18 };

19 class CDerived : public CBaseX, public CBaseY

20 {

21 public:

22 int z;

23 }; 24

25 int main(int argc, char *argv[])

26 {

27 float f = 12.3;

28 float* pf = &f; 29

30 //基本类型的转换

31 cout<<\

32 //======static cast<>的使用:

33 int n = static_cast(f); //成功编译

34 cout<<\

35 //int* pn = static_cast(pf);//编译错误,指向的类型是无关的,不能将指针指向无关的类型

36 void* pv = static_cast(pf);//编译成功

37 int* pn2 = static_cast(pv);//成功编译, 但是 *pn2是无意义的内存(rubbish)

38 cout<<\三者值一样

39 cout<<\是无用值,注意无法使用\因为编译错。 40

41 //======reinterpret_cast<>的使用:

42 //int i = reinterpret_cast(f);//编译错误,类型‘float’到类型‘int’的转换无效.

43 //成功编译, 但是 *pn 实际上是无意义的内存,和 *pn2一样

44 int* pi = reinterpret_cast(pf);

45 cout<<\值一样

46 cout<<\是无用值,和pn2一样。 47 48

49 //对象类型的转换

50 cout<<\

51 CBaseX cx;

52 CBaseY cy;

53 CDerived cd; 54

55 CDerived* pD = &cd;

56 CBaseX *pX = &cx;

57 CBaseY *pY = &cy;

58 cout<<\ 59

60 //======static_cast<>的使用:

61 CBaseY* pY1 = pD; //隐式static_cast转换

62 //不一样是因为多继承,pD还要前移动以便也指向CBaseX.

63 cout<<\ 64

65 //CDerived* pD1 = pY1;//编译错误,类型 ‘CBaseY*’ 到类型 ‘CDerived*’ 的转换无效

66 CDerived* pD1 = static_cast(pY1);//成功编译

67 cout<<\现在 pD1 = pD 68

69 //pX = static_cast(pY);//编译错误,从类型 ‘CBaseY*’ 到类型 ‘CBaseX*’ 中的 static_cast 无效。

70 pD1 = static_cast(pY);//竟然可以编译通过!!!!!!

71 cout<<\现在 pD1 = pY-4

72 //======reinterpret_cast<>的使用:

73 CBaseY* pY2 = reinterpret_cast(pD);// 成功编译, 但是 pY2 不是 CBaseY*

74 cout<<\ 75

76 //======通过void的转换注意:

77 CBaseY* ppY = pD;

78 cout<<\ 79

80 void* ppV1 = ppY; //成功编译

81 cout<<\ 82

83 //CDerived* ppD2 = ppV1;//编译错误,类型‘void*’ 到类型 ‘CDerived*’的转换无效

84 CDerived* ppD2 = static_cast(ppV1);

85 cout<<\, 但是我们预期 ppD2 = ppY - 4 = pD

86 //ppD2->bar();//系统崩溃,段错误

87 return 0;

88 }

这里,需要注意的地方是:

*第63行中基类指针pY1被赋予子类指针pD后,pY1=pD+4而不是pD,因为pD是多继承,pD还要前移动以便也指向CBaseX.内存布局大致如下:

+CDerived------------------+

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库关于C++中的类型转换操作符(2)在线全文阅读。

关于C++中的类型转换操作符(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/656469.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: