老师,我想问下,用const_cast给*pa赋值之后,为什么cout出来a和*pa的值不同而pa和&a的值相同?即值不同而地址却相同

来源:9-8 const_cast的使用

ExcellentMiao

2020-11-19

老师,我想问下,用const_cast给*pa赋值之后,为什么cout出来a和*pa的值不同而pa和&a的值相同?即值不同而地址却相同

写回答

1回答

quickzhao

2020-11-20

其实如果你能跟踪汇编会看得很清楚。这里pA指向a的地址没问题,所以&a和pA是相等的,修改pA所指内存的值,a内存处的值已经变了。当你再使用a的值时,由于定义的是const int a, 根据约定a的值定义了不能变,于是编译器会记录下a原来的值,当你使用时会直接赋值;而不再使用此时a内存里的值。所以你cout会看到a的值没有变,但实际内存的值已经变了。

4
6
易萧
回复
cylqd
const本就是不可变的约定,所以编译器有理由认为任何用到a的地方都应该是同一个值,使用指针去改变它的值并不是一个明智的做法,比如Java的final不会让你有任何办法去修改它。static_cast本身就是让你明白你自己在做什么,但常量就是常量,这不意味着你可以影响系统中其它依赖于它的地方,如果你要这样做,那么你应该去掉const,因为它已经形同虚设了,或者在需要跟随变动的地方同样使用它的指针进行解引用,而不是直接使用该常量。 站在另一个角度考虑,如果我使用的常量都是不可信的,那么我后面的所有相关代码都无法再信任它。
2022-08-22
共6条回复

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3911 学习 · 1106 问题

查看课程