文档章节

类型转换

pp__qq
 pp__qq
发布于 2015/02/24 22:02
字数 389
阅读 10
收藏 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++的类型转换

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

沙米笔记
2016/06/26
59
0
C++开发必看 四种强制类型转换的总结

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

goodhacker的博客
2011/07/22
0
0
C#中 As 和强制转换的总结

1.1.1 摘要 C#是一门强类型语言,一般情况下,我们最好避免将一个类型强制转换为其他类型,但有些时候难免要进行类型转换。 先想想究竟哪些操作可以进行类型转换(先不考虑.NET提供的Parse)...

长平狐
2012/06/11
69
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行...

Java填坑之路
22分钟前
1
0
Spring Aop原理之Advisor过滤

在上文(Spring Aop之Advisor解析)中我们讲到,Spring Aop对目标bean的代理主要分为三个步骤:获取所有的Advisor,过滤当前bean可应用的Advisor和使用Advisor为当前bean生成代理对象,并且上文...

爱宝贝丶
33分钟前
0
0
JMockit学习教程

1 JMockit中文网 我觉得如果仅仅是开发自测的话,把JMockit中文网认真看一遍,就可以在项目中使用JMockit了。 http://jmockit.cn/index.htm 2 JMockit中文教程 官方文档中文版。对于不喜欢看...

SuperHeroes
44分钟前
0
0
Linux服务器几乎从不采用Arch Linux?

我们见得多的Linux服务器系统一般都是什么Ubuntu Server啊,什么Cent OS啊,什么Fedora啊,或者企业采用的Red Hat啊,为什么几乎没有Arch Linux呢?下面我将从若干个方面指出Arch Linux在服务...

linux-tao
56分钟前
0
0
js 函数柯里化 闭包

参考 https://mp.weixin.qq.com/s/GEHL3jarDdAAcr5tQGjmDg 一个统计求和的函数 需要知道整个数组的信息,然后遍历求值 function countMoney() { let money = 0 // 温馨提示:arguments...

阿豪boy
58分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部