#include <iostream>using namespace std;int main()
{const int a = 5;const int * p = &a;int *p_var = NULL;p_var = const_cast <int*>(p);   //强转为非const指针
    cout << a <<endl;*p_var = 10;    //重新赋值
    cout << "*p=" << *p << endl;         //输出10
    cout << "*p_var=" << *p_var << endl; //输出10
    cout << "a=" << a << endl;           //输出5
    system("pause");return 0;
}

以上代码将const int*强转为int*之后再赋值

为什么a的值没有变还是5

而*p 与 *p_var都是10

我没有办法理解啊,望高手指点

以上代码是在VC6上的运行结果

编程语言C++
wangyao1052 | 初学一级 | 园豆:128
提问于:2011-09-25 10:28

最佳答案
1

const_cast用来丢弃变量的const声明,但不能改变变量所指向的对象的const属性。即:const_cast用于原本非const的对象;如果用于原本const的对象,结果不可预知(C++语言未对此种情况进行规定)

清注意我上面用下划线标示的“变量”vs“对象”

这个要自己慢慢体会

一般情况下const_cast是用于这种情形:const指针(变量)指向非const对象,程序员确认这一点(所指向的对象非const)时,使用const_cast操作符丢弃变量的const修饰获得一个非const指针

看看《The C++ Programming language(special edition)》第15.4.2.1节的最后一段,仔细揣摩它的每个词。。。

收获园豆:80
回复 | bye_passer | 菜鸟二级 |园豆:367 | 2011-09-25 15:09

其他回答(1)
0

这个 其实 很简单,你p是const指针,指向的那块内存区域的值是不可改变的,现在将p赋给p_var,p_var是非const指针,也就是说p_var指向的那块内存区域的值是可改变的,a是个常量,其值肯定是不会变的。如果没有const_cast编译是不能通过的,那先看看const_cast到底做了什么

const_cast<T*>(a)
编译器在编译期处理
去掉类型中的常量,除了const或不稳定的变址数,T和a必须是相同的类型。
表达式const_cast<T*>(a)被用于从一个类中去除以下这些属性:const, volatile, 和 __unaligned。
class A { ... };
void f()
{
    const A *pa = new A;//const对象
    A *pb;//非const对象
    //pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
    pb = const_cast<A*>(pa); // 现在OK了
    ...
}
对于本身定义时为const的类型,即使你去掉const性,在你操作这片内容时候也要小心,只能r不能w操作,否则还是会出错
const char* p = "123"; 
char* c = const_cast<char*>(p); 
c[0] = 1;   //表面上通过编译去掉了const性,但是操作其地址时系统依然不允许这么做。
const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。

现在应该明白了吧。强制转换把p的const属性去掉了,又因为p和p_var又指向新的同一块内存区域,就是文字常量10所在的内存区域,所以*p和*p_var的值都是10.
尽量不要使用const_cast,如果发现调用自己的函数,竟然使用了const_cast,那就赶紧打住,重新考虑一下设计吧。

回复 | Daywei | 园豆:549 (小虾三级) | 2011-09-25 14:42 |

你的解释应该是错的

楼下的解释是对的

const_cast用于原本非const的对象;如果用于原本const的对象,结果不可预知(C++语言未对此种情况进行规定)

const指针强转为非const指针后的赋值问题相关推荐

  1. c语言const 转为非const的问题

    昨天碰到一个奇葩的问题. 我定义的数据结构 struct tree {tree* left;tree* right; } 然后我用priorityqueue< tree>载入进去.但是这个 ...

  2. const对象不能调用非const成员函数

    在C++中,可以用const来定义一个const对象,但const对象不可以调用类中的非const成员函数 原因 引发原因:: 由调用成员函数时隐式传入的当前对象的this指针引起. 非const成员 ...

  3. C++ const对象与非const对象的相互调用、const成员函数与非const成员函数的相互调用

    1)const对象可以调用非const成员函数吗? 答:不能.const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可 ...

  4. const对象只能调用const成员函数、不能调用非const成员函数;非const对象可以调用const成员函数

    引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起. 1. 非const成员函数中的隐式参数:classA* this 2. const成员函数中的隐式参数:const classA* ...

  5. c++ const 转非const

    #include <iostream> #include <stdio.h> using namespace std;struct DexHeader{int off; }; ...

  6. 指针、引用、const、类的浅显理解

    指针.引用.const.类的浅显理解 一.引用 1.1 理解与实验 和const 1.1.1 实验一 1.1.1 实验二 二.指针 三.指针和引用的区别 四.const(const和pointer) ...

  7. 成员函数对象类的const和非const成员函数的重载

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 1. 类的const成员函数与非const成员函数的载重 #include <iostream> #include <st ...

  8. 类中const函数及非const函数的调用规则

    转自:点击打开链接 类中const函数及非const函数的调用规则 class Student { public:int getAge(){return m_age;}int getAge() con ...

  9. C++类中const函数与非const函数的调用规则

    class EX{public:void constFunction() const; }; 如上所示,通过将类成员函数声明为const,以表示这个函数不可以修改类中的成员变量. 建议将不可以修改数据 ...

最新文章

  1. 一步步构建多层架构系列二之设计模式运用篇
  2. ORA-07445 [kxsxsi()+450] [SIGSEGV]
  3. php 垃圾回收机制 转载
  4. 每日程序C语言6-判断某范围之间的素数
  5. owncloud 10.0 php,基于Linux云服务器CentOS 7上安装OwnCloud 10.0.8
  6. 智慧城市的宠儿 大数据为城市建设添彩
  7. Windows Server 2008 R2的教程36篇!
  8. matlab画图命令
  9. 图像识别与软件自动化测试
  10. ie工具internet选项安全自定义级别java_activex控件被禁止怎么办
  11. 单元词检索计算机,截词检索
  12. 2020最新Ubutu18.04安装NVIDIA出现如下报错解决方法[亲测可用]
  13. Golang开发环境LiteIDE的设置
  14. Android开发学习之路III-服务器技术篇
  15. Strategy策略模式详解与实例
  16. 维和医疗分队患者信息管理系统的开发与研究
  17. 门铃C语言设计程序,单片机C语言程序设计:用定时器设计的门铃
  18. LeetCode 41. 缺失的第一个正数 First Missing Positive
  19. ListView动态刷新某项Item
  20. visualDL(一)scalar标量图

热门文章

  1. ClickHouse的可视化工具Tabix
  2. Mysql: 错误代码:1054 Unknown column ‘ ‘ in ‘field list‘
  3. 计算机动画设置进入,计算机文化基础动画效果设置.ppt
  4. fl2440开发板之u-boot移植
  5. Arcgis pro——获取经纬度坐标
  6. 几百块的投影仪靠谱吗?难道没有便宜又好用的吗?
  7. 闵可夫斯基引擎Minkowski Engine
  8. Codeforces Round #719 (Div. 3)题解
  9. JavaScrip作用域和递归函数知识点梳理
  10. matlab profile,[转载]matlab profile的使用【原创】