文档章节

类型转换

pp__qq
 pp__qq
发布于 2015/02/24 22:02
字数 389
阅读 10
收藏 0
点赞 0
评论 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 的使用.

    

© 著作权归作者所有

共有 人打赏支持
pp__qq
粉丝 17
博文 51
码字总数 97223
作品 0
合肥
程序员

暂无相关文章

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 5分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 38分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 56分钟前 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部