改变const值的方式

一种改变const值的方式是使用const_cast类型转换符,将const变量转换为一个该变量的引用,通过这个引用去改变值,这种方法的实质就是用地址改变内存的值。如下实例:

struct SA {

int i = 0;

};

const SA sa;

cout << sa.i << endl;

SA &sb = const_cast<SA&>(sa);

sb.i = 11;

cout << sa.i << endl;

上述这种方式中对象sa是存储在内存中的,并且这个内存在系统中是可更改的,所以我们 可以利用上述这种方式来做改变。

考虑下面的实例:

const int i
= 0;

int &b = const_cast<int  
&>(i);

b = 10;

cout << i << endl;

cout << b << endl;

结果将不如人所料,i输出的值还是0,b输出的值是10.这是什么原因呢?这主要是因为C++编译器中const的实现机制的问题。在C++中,const会被看成是一个常量,所以像数值,字符串这类的值,编译器都会将其放入文字常量区,这也是python中的处理方式。当声明一个引用类型的b时,编译器为他在内存中(栈,不是文字常量区)分配空间,因此是可以改变的。那么我们怎么改变i的值呢?想办法获取此时0在文字常量区的地址,将其改变会不会是一种方式呢?

时间: 2024-10-06 01:19:41

改变const值的方式的相关文章

我错误的去试图用QList里面的at方法改变const常量的值

在做曲线工厂的程序的时候,我写了一行代码是这样的: AllLines.at(cruveSecions).p1().setY(20); AllLines是QList<QLineF>类型的,cruveSections是int类型的,这里我犯了一个很低级但是很容易犯的错误,我本是图个方便,然后导致AllLines里面的数据老是更新不了,我很纳闷,最后同事通过查API给我找出了错误的原因.是这样的QList里面通过at访问出来的是个常量,里面的值不能修改成功,但是我很纳闷编译器也不报错,我想可能是se

[转]WinExec、ShellExecute和CreateProcess及返回值判断方式

[转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/2392472.html 有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateProcess因为使用复杂,比较少用. WinExec主要运行EXE文件. ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT u

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

JS杂技之无中间变量的值交换方式

从http://www.cnblogs.com/liuyitian/p/4081517.html#3074553看到一种无中间变量的值交换方式,具体如下: var a = 1;var b = 2;a = [b, b=a][0]alert(a+'_'+b) // 结果 2_1,a和b的值已经互换 端详代码,技巧是用一个匿名数组来储存和交换值,这种方式暗里需要新建数组的,它相对于新建变量我感觉时间空间上都没优势,可读性还差些.只是写法稍简短花哨一些.

Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现.子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常

Ext_两种处理服务器端返回值的方式

1.Form表单提交返回值处理 //提交基本信息表单  f.form.submit({      clientValidation:true,      //表单提交后台处理地址      url:'/globe_background/Commonality/AccountClub.ashx?action=updateuserinfoform&uid=' + jsonDate.uid,      //数据提交方式      method:'POST',                      

c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变

若程序把对象加入队列,对象为全局变量,对象改变队列值也跟着改变,如下: filecontent  为两个字段的属性值. class FileContent { // public string Httpaddress { get; set; } public string Cardid { get; set; } public string Autcode { get; set; } } FileContent filecontent = new FileContent(); private v

移动应用改变企业传统沟通方式

现在就说移动化将颠覆IT市场还为时尚早.不过,会畅通讯产品战略部产品战略总监朱明捷看到已有厂商在开发高度集成的移动化办公设备--将PC.笔记本电脑.平板电脑.电话等多种功能融为一体.如果这样的设备以后成了办公的必备品,那么移动化的颠覆性就不再是一句口号. 在一次医疗行业的信息化会议上,记者看到上海会畅通讯股份有限公司(以下简称会畅通讯)产品战略部产品战略总监朱明捷兴致勃勃地演示其移动应用产品,而听众也都听得聚精会神. 随着智能手机.平板电脑等终端设备的应用越来越广泛,移动应用正在改变传统的企业级

Override和Overload区别,Overloaded的方法是否可以改变返回值的类型?

Overload是重载的意思, Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现. 子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子