针对const_cast,太多人在用同一个示例问同一个问题:
void main(){
   const int a = 3;
   const int *pc = &a;
   int *p = const_cast<int *>(&a);
   *p = 5;
   printf("%d,%d,%d",*p,*pc,a); //结果是 5,5,3
}
最终输出的a,为何是3而不是5?
C++对用const定义的常数变量,不是靠地址空间中的内容来取数的,而是靠保存在符号表中的索引来取数的,因此常数变量a无论什么情况下使用都是常数3。
事实上,变量a地址空间中的内容确实是5,但即使你*(&a)来取数仍是3。你可以这样来取变量a地址空间中的内容:
  const int *d = &a;
  printf("%d\n", *d);

  int d = const_cast<int>(&a);
  printf("%d\n", *(int *)d);
此时输出的结果是5。

上述问题都是针对单变量常数而言的,对于结构或类,const_cast的使用与你的直观理解是无出入的。
C++提供了去除const或volatile属性的const_cast类型转换,使你可以对一常数变量进行修改,问题是你的设计为什么会导致非要对一常数变量进行修改呢?
C++的编程准则:const或volatile属性,禁止在指针或引用的类型转换中移除。

C++:const_cast类型转换的更多相关文章

  1. static_cast, dynamic_cast, const_cast 类型转换如何使用?

    static_cast 用法:static_cast < type-id > ( expression ) 说明:该运算符把expression转换为type-id类型,但没有运行时类型检 ...

  2. 清楚理解const_cast类型转换

    1.任何使用原常量的地方, 已经直接编码到代码中去了.故后续转换类型并不能改变原定义 2.const_cast转换, 是使用了新指针或者引用,指向了原定义的内存,故而可以修改该内存. 使用也得用新指针 ...

  3. const_cast的应用

    对于const变量,我们不能修改它的值,这是这个限定符最直接的表现.但是我们就是想违背它的限定希望修改其内容怎么办呢?于是我们可以使用const_cast转换符是用来移除变量的const限定符.con ...

  4. Google开发规范

    v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件   ...

  5. Google's C++ coding style

    v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件   ...

  6. C++Primer笔记-----day03

    ==============================================================day03================================= ...

  7. c++开发规范

    目录 1. 头文件 1.1. Self-contained 头文件 1.2. #define 保护 1.3. 前置声明 1.4. 内联函数 1.5. #include 的路径及顺序 2. 作用域 2. ...

  8. Google C++编程风格指南 - 中文版

    Google C++编程风格指南 - 中文版 from http://code.google.com/p/google-styleguide/ 版本: 3.133原作者: Benjy Weinberg ...

  9. const学习(续)

    续接上一篇<C++ const学习> const与成员函数 之前说到了const修饰成员函数本身. const成员函数不能修改对象成员值 对于const或者费const对象都可以调用con ...

随机推荐

  1. Corosync+pacemaker实现集群的高可用

    一.Corosync和pacemaker的了解: Corosync是集群管理套件的一部分,他在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等.也就是说,corosync是Mess ...

  2. c# 加密工具类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  3. [AirFlow]AirFlow使用指南一 安装与启动

    1. 安装 通过pip安装: xiaosi@yoona:~$ pip install airflow 如果速度比较慢,可以使用下面提供的源进行安装: xiaosi@yoona:~$ pip insta ...

  4. SpringMVC札集(07)——JSON数据

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  5. TreeSet实现原理及源码分析

    类似于HashMap和HashSet之间的关系,HashSet底层依赖于HashMap实现,TreeSet底层则采用一个NavigableMap来保存TreeSet集合的元素.但实际上,由于Navig ...

  6. wordpress 生成自定义 meta box

    工具 https://jeremyhixon.com/tool/wordpress-meta-box-generator/ 使用 生成代码 /** * Generated by the WordPre ...

  7. Scrapy爬虫库使用初体验

    安装pip install Scrapy 中间可能会遇到的问题: 超时,网络问题需要多次尝试 缺少vc++库,官网可以下载 win32api缺失,https://sourceforge.net/pro ...

  8. Android中的关于MDM中的几个方法举例

    Android中的关于MDM中的几个方法举例 首先介绍一下MDM是什么的缩写,MDM是什么? MDM 是 (Mobile Device Management )的缩写,中文翻译过来就是移动设备管理.随 ...

  9. 3DsMax动画插件

    * 简易骨骼动画: Mesh当前帧顶点 = Mesh绑定时顶点 * 绑定时骨骼的变换到本帧骨骼的变换的改变量. = Mesh绑定时顶点 * 绑定时骨骼的变换的逆矩阵 * 本帧的骨骼变换. = Mesh ...

  10. XML专题:使用NSXMLParser解析xml文件

    使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data ...