有时候在写一些测试代码的时候,偶尔会出现需要修改const变量的操作,在通过指针或者引用修改const变量后,居然可以编译成功。于是就引起了困惑——既然可以修改,那const声明的意义何在呢?
看下面的代码
const int i = 12; int& j = (int&)i; j = 15; std::cout << i << " " << j;// 12 15将会输出 12 15.为什么呢(不使用引用,改成指针,结果也是一样),是因为const关键字起作用了吗 下面验证一下
int i = 12; int& j = (int&)i; j = 15; std::cout << i << " " << j << std::endl;// 15 15可以看到输出确实发生了变化,说明const关键字确实起到了保护变量不被修改的作用,但是,事实真的是这样吗,如果直接从内存中查看数据,上面两个实验中 变量 i 的内存值都会发生改变,不管有没有const关键字。那为什么有const版本的输出不会变化呢,下面引入volatile关键字来做进一步分析
可以看到i的输出值均和修改值一致。
1.const确实可以对变量起到一定的保护作用,但是这种保护作用仅作用在编译器的符号表中(这种做法叫C++常量折叠),而不是内存,也就是说,在const变量声明之后,如果没有对符号表进行修改,那么变量的读取值不会发生变化(实际上内存值已经发生了变化),这是编译器进行的优化。 2.volatile关键字表示这个变量是时常发生修改的,告诉编译器每次这个变量都要去内存中重新读取,不能直接使用符号表中值,如此才出现最后两个实验中,输出值和修改值一致的现象。 -----参考 https://blog.csdn.net/weixin_41413441/article/details/80860135
关于volatile 关键字,其实不仅仅可以用在const变量上,还能在上位机程序中,需要保存某个端口数据中发挥作用------http://www.cppblog.com/mzty/archive/2006/08/08/10959.html