文档章节

类型转换

pp__qq
 pp__qq
发布于 2015/02/24 22:02
字数 389
阅读 11
收藏 0

const_cast

  • const_cast<新类型>(表达式);会去除"表达式"的 const,volatile 属性,如下:

int const ci = 33;
int const *ciptr = &ci;
int *var0 = const_cast<int*>(&ci);
// "&ci"的正确类型应该是 int const *;const_cast 转换会去除 const 属性
// 即转换结果的类型是 int* 类型.
int const * const ciptrc = &ci;
int const * const *ciptrcptr = &ciptrc;
int **var1 = const_cast<int**>(&ciptrc);
// "&ciptrc"的正确类型是 int const * const *,const_cast 转换会去除所有的 const 属性,
// 因此转换后表达式的类型是 int**,

reinterpret_cast

  • 仅仅是重新解释了给出对象的比特模型而没有修改这个比特模型.如下:

int i = 0x1223;
int *i_ptr = &i;
float *f_ptr = reinterpret_cast<float*>(i_ptr);
// 此时 i_ptr 与 f_ptr 的值相同,均为 0x227fc;只不过在 i_ptr 中,将该值解释为一个
// 指向 int 类型数据的指针;而在 f_ptr 中,将该值解释为指向着 float 类型的指针.

struct A{
    int i;
};
struct B{
    int i;
};  
struct C:public A,public B{
};
C c;
C *c_ptr = &c;
B *b_ptr1 = (B*)c_ptr; // 此时 b_ptr1 的值为 c_ptr+sizeof(A),参见"C++对象模型"
B *b_ptr = reinterpret_cast<B*>(c_ptr);
// 此时 b_ptr 的值与 c_ptr 的值相同,即只是重新解释比特模型,并不修改比特模型.

  • reinterpret_cast 并不会去除 const,volatile 属性,如:

volatile int i = 33;
int volatile *i_ptr = &i;

float *f_ptr = reinterpret_cast<float*>(i_ptr);
// 错误:从类型"volatile int*"到类型"float*"的 reinterpret_cast 丢失了限定符

float volatile *f_ptr1 = reinterpret_cast<float volatile*>(i_ptr); 
// 正确,保留 volatile 限定符

float *f_ptr2 = const_cast<float*>(reinterpret_cast<float volatile*>(i_ptr)); 
// 此时也是正确的,利用 const_cast 来去除 const,volatile 限定符.

  • 参见 libstdc++/include/bits/move.h 中 std::__addressof 对 reinterpret_cast 的使用.

    

© 著作权归作者所有

共有 人打赏支持
上一篇: 二叉搜索树
下一篇: const;volatile
pp__qq
粉丝 17
博文 66
码字总数 97223
作品 0
合肥
程序员
私信 提问
C++开发必看 四种强制类型转换的总结

  【IT168 技术】C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:   TYPE b = (TYPE)a   C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。   c...

goodhacker的博客
2011/07/22
0
0
Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串。也就是说服务器接收到的来自用户的数据只能...

长平狐
2012/11/12
73
0
C++与类型转换相关的四个关键字

C++与类型转换相关的四个关键字有:constcast、staticcast、dynamiccast、reinterpretcast C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a。 C++风格的...

Jim-he
03/28
0
0
小端模式与强制数据类型转换

小端模式与强制数据类型转换 1.先从一个问题说开去 C++数据类型转换的问题 这里为什么输出的是b? 2.先检测一下我们所使用的电脑的CPU的字节序 版本一(有问题,结果无论如何都是34,不能说明...

长平狐
2013/06/03
424
0
2016Java面试题精编版—类型转换

动力节点Java培训   面试题   Whichofthefollowingwillcompilecorrectly?(D)   Ashortmyshort=99S   Bintt=”abc”.length()   Cfloatz=1.0   Dcharc=17c   解析:shortmyshor......

忻峰作浪
2016/11/21
7
0

没有更多内容

加载失败,请刷新页面

加载更多

Web安全之XSS攻击与防御小结

Web安全之XSS攻防 1. XSS的定义 跨站脚本攻击(Cross Site Scripting),缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从...

前端小攻略
18分钟前
1
0
JavaScript中的继承及实现代码

JS虽然不像是JAVA那种强类型的语言,但也有着与JAVA类型的继承属性,那么JS中的继承是如何实现的呢? 一、构造函数继承 在构造函数中,同样属于两个新创建的函数,也是不相等的 function Fn...

peakedness丶
21分钟前
1
0
记一次面试最常见的10个Redis"刁难"问题

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。 Redis在...

小刀爱编程
34分钟前
13
0
TiDB Lab 诞生记 | TiDB Hackathon 优秀项目分享

本文由红凤凰粉凤凰粉红凤凰队的成员主笔,他们的项目 TiDB Lab 在本届 TiDB Hackathon 2018 中获得了二等奖。TiDB Lab 为 TiDB 培训体系增加了一个可以动态观测 TiDB / TiKV / PD 细节的动画...

TiDB
47分钟前
4
0
当区块链遇到零知识证明

本文由云+社区发表 当区块链遇到零知识证明 什么是零知识证明 零知识证明的官方定义是能够在不向验证者任何有用的信息的情况下,使验证者相信某个论断是正确的。这个定义有点抽象,下面笔者举...

腾讯云加社区
56分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部