const_cast的小问题

const_cast只可以对指针和引用使用

也许大家都有过这样的疑惑:const_cast可以去除一个常量的const属性,去除const属性后应该可以对“常量”进行修改,通过调试器发现内存中的值是被改变的,可是再传递这个“常量”的时候,值却一直保持原状,这是为什么呢?

void fun(int &value)
{
	cout << "Fun(val)=" << value << endl;
}


int main() {
	const int val = 100;
	int*ptr = const_cast<int*>(&val);
	*ptr = 200;
	cout << &val << endl;
	cout << ptr << endl;
	cout << "val=" << val << endl;
	cout << "*ptr=" << *ptr << endl;

	const int&c_ref = val;
	int& ref = const_cast<int&>(c_ref);
	ref = 300;
	cout << "val=" << val << endl;
	cout << "ref=" << ref << endl;
	fun(const_cast<int&>(val));
	system("pause");
	return 0;
}

在这里插入图片描述
可以看出打印的地址是一样的,而且奇怪的是val还是等于100,而通过*ptr打印出来的却是更改后的200;再者fun函数打印的是300,即被引用再次修改了一次。

原因:系统是对val这个const进行了预处理般的替换,将它替换成“64h”(十六进制的64就是十进制的100),即在编译生成的指令中val就已经被替换成100了,其实加const只是告诉编译器不能修改而不是真正地不可修改,如果程序员不注意而去修改了它会报错,现在我们利用const_cast去除了常量性,然后通过指针和引用对其进行了修改,所以通过指针打印或者引用传参的时候就能看出其内存确实变化了,但为了保护val这个变量本来的const特性,所以每次我们使用val时,系统都将其替换成初始值100,确保了val还是“不可变”的。

参考文献链接:
https://blog.csdn.net/jnu_simba/article/details/8868530

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值