文档章节

类型转换

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 的使用.

    

© 著作权归作者所有

共有 人打赏支持
pp__qq
粉丝 17
博文 66
码字总数 97223
作品 0
合肥
程序员
C++与类型转换相关的四个关键字

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

Jim-he
03/28
0
0
[毕业生的商业软件开发之路]C#数据类型转换

近期开始接触到在校学生、高校实习生和毕业生,在此说一下笔者对这些徘徊在职场门口的学生一些建议,希望能给这些初学者进入软件开发行业带来一些帮助,使得毕业生能更顺利的进入软件开发公司开...

技术小胖子
2017/11/02
0
0
C++开发必看 四种强制类型转换的总结

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

goodhacker的博客
2011/07/22
0
0
C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)

C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式。笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊 ( 生活所迫,工作还得写C++啊)C++语言提供了...

LeeHappen
09/29
0
0
C++的类型转换

1、类型转换名称和语法 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。    sta...

沙米笔记
2016/06/26
59
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
5
0
现场看路演了!

HiBlock
昨天
16
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
19
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部