zoukankan      html  css  js  c++  java
  • C++:const_cast类型转换

    针对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 ", *d);

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

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

  • 相关阅读:
    CSS Sprite
    使用float和display:block将内联元素转换成块元素的不同点
    [POJ 1185] 炮兵阵地
    [POJ 1947] Rebuilding Roads
    [HDU 1561] The more, The Better
    [HDU 1011] Starship Troopers
    [POJ 1155] TELE
    [HDU 2196] Computer
    [HDU 1520] Anniversary party
    [HDU 5029] Relief grain
  • 原文地址:https://www.cnblogs.com/ymy124/p/3643601.html
Copyright © 2011-2022 走看看