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