对于const变量,我们不能修改它的值,这是这个限定符最直接的表现。但是我们就是想违背它的限定希望修改其内容怎么办呢?于是我们可以使用const_cast转换符是用来移除变量的const限定符。
const_cast类型转换能够剥离一个对象的const属性,也就是说允许你对常量进行修改。

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. /*
  5. 用法:const_cast<type_id> (expression)
  6.   该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
  7.   一、常量指针被转化成非常量指针,并且仍然指向原来的对象;
  8.   二、常量引用被转换成非常量引用,并且仍然指向原来的对象;
  9.   三、常量对象被转换成非常量对象。
  10. type_id 必须为指针或引用
  11. */
  12.  
  13. class B
  14. {
  15. public:
  16. int m_iNum;
  17. B() : m_iNum()
  18. { }
  19. };
  20.  
  21. void foo()
  22. {
  23. const B *b1 = new B();
  24. //b1->m_iNum = 100; // 编译错误
  25. // 做如下转换,体现出转换为指针类型
  26. B *b2 = const_cast<B*>(b1);
  27. b2->m_iNum = ;
  28. cout<<"b1: "<< b1->m_iNum <<endl;
  29. cout<<"b2: "<< b2->m_iNum <<endl;
  30.  
  31. const B b3;
  32. //b3.m_iNum = 100; // 编译错误
  33. B b4 = const_cast<B&>(b3); // b4是另外一个对象
  34. b4.m_iNum = ;
  35. cout<<"b3: "<<b3.m_iNum <<endl;
  36. cout<<"b4: "<<b4.m_iNum <<endl;
  37.  
  38. const B b5;
  39. //b5.m_iNum = 100; // 编译错误
  40.  
  41. // 或者左侧也可以用引用类型,如果对b6的数据成员做改变,就是对b5的值在做改变
  42. B &b6 = const_cast<B&>(b5);
  43. b6.m_iNum = ;
  44. cout<<"b5: "<<b5.m_iNum <<endl;
  45. cout<<"b6: "<<b6.m_iNum <<endl;
  46.  
  47. // force to convert
  48. const int x = ;
  49. int* y = (int *)(&x); // 同样的地址,但是内容是不一样的
  50. *y = ;
  51. cout << "x: "<<x<<" address: "<<&x<<endl;
  52. cout << "*y: "<<*y<<" address: "<<y<<endl;
  53. cout<<endl;
  54.  
  55. const int xx = ;
  56. int* yy = const_cast<int *> (&xx); // 同样的地址,但是内容是不一样的
  57. *yy = ;
  58. cout << "xx: "<<xx<<" address: "<<&xx<<endl;
  59. cout << "*yy: "<<*yy<<" address: "<<yy<<endl;
  60. cout<<endl;
  61. // int
  62. const int xxx = ;
  63. int yyy = const_cast<int&> (xxx); // yyy是另外一个int对象
  64. yyy = ;
  65. cout << "xxx: "<<xxx<<" address: "<<&xxx<<endl;
  66. cout << "yyy: "<<yyy<<" address: "<<&yyy<<endl;
  67. }
  68.  
  69. int main(void)
  70. {
  71. foo();
  72. return ;
  73. }

运行结果如下:

const_cast的应用的更多相关文章

  1. c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast

    c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast  [版权声明]转载请注明出处 http://www.cnblogs.c ...

  2. C++强制类型转换操作符 const_cast

    const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转 ...

  3. static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别

    static_cast 1. 基础类型之间互转.如:float转成int.int转成unsigned int等 2. 指针与void*之间互转.如:float*转成void*.CBase*转成void ...

  4. [转载]const_cast

     1. 一个经典实例 /* 用法:const_cast<type_id> (expression) 该运算符用来修改类型的const或volatile属性.除了const 或volatil ...

  5. c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast

    c++强制类型转换:dynamic_cast.const_cast .static_cast.reinterpret_cast 博客分类: C/C++ CC++C#编程数据结构  dynamic_ca ...

  6. static_cast dynamic_cast const_cast reinterpret_cast总结对比

    [本文链接] http://www.cnblogs.com/hellogiser/p/static_cast-dynamic_cast-const_cast-reinterpret_cast.html ...

  7. static_cast, dynamic_cast, const_cast

    http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...

  8. 强制类型转换(const_cast)

    [1] const_cast的作用 一.常量指针被转化成非常量指针,并且仍然指向原来的对象: 二.常量引用被转换成非常量引用,并且仍然指向原来的对象: 三.常量对象被转换成非常量对象. [2] 实例代 ...

  9. C++-const_cast, reinterpret_cast, static_cast的用法

    /////////////////////////////////////////////////////////////////////////////// // // FileName : cas ...

  10. C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast

    Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用st ...

随机推荐

  1. Linux vi/vim替换命令的使用说明[转]

    vi/vim 中可以使用 :s 命令来替换字符串.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky:s/vivian/sky/g 替换当前行所有 vivian 为 sky:n, ...

  2. Js字符串与十六进制的相互转换 【转】

    开发过程中,字符串与十六进.二进制之间的相互转换常常会用到,尤其是涉及到中文的加密时,就需要把中文转换为十六进制.下面说说具体的转换方法. 1.字符串转换为十六进制 主要使用 charCodeAt() ...

  3. java Web的MVC最基础暂定分层包

    数据封装 entity, 数据访问对象  Dao, 业务逻辑 servlet, ----- 网页显示层 jsp 加上 jsp附带技术 el表达式和jstl ,jsp 标记库语言, el表达式 ${us ...

  4. 是时候用PerconaDB替换MySQL了

    Percona数据库服务器是MySQL的增强版,替代MySQL并不复杂. 一.PerconaDB的特性 1)查询速度更快,数据的一致性更好 2)服务器运行及其稳定 3)可以延迟分片,或者避免分片 4) ...

  5. POJ 1636 Prison rearrangement DFS+0/1背包

    题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS   Memor ...

  6. Android 启动、绘制、显示过程

    Activity 启动过程: startActivity()-> Instrumentation.execStartActivity()-> Binder->ActivityMana ...

  7. 腾讯云服务器 离线安装最新稳定版MariaDB 10.2.6

    数据库方面我们一般都是使用mysql,由于前段时间我们切换到了MariaDB后,当然生产环境也要更着变,谁叫oracle是个碧池呢! mariaDB主要有三种安装方式 源码安装,有点繁琐,不推荐 yu ...

  8. C#读取对象实例的值和对对象的属性自动赋值方法

    using System; using System.Data; using System.Reflection; namespace DBUtility { /// <summary> ...

  9. 行为类模式(十一):访问者(Visitor)

    定义 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. UML 优点 符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的 ...

  10. 菜鸟学Java(十五)——Java反射机制(二)

    上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...