这两个术语有什么区别,为什么我需要mutable
?
答案 0 :(得分:36)
“物理”常量来自声明对象const
,原则上可以通过将对象放在只读内存中来强制执行,因此它不能更改。试图改变它会导致不确定的行为;它可能会改变,也可能不会,或者可能触发保护错误,或者它可能会熔化存储芯片。
“逻辑”constness来自声明引用或指针const
,并由编译器强制执行。对象本身可能是也可能不是“物理”const,但是如果没有强制转换,则不能使用引用来修改它。如果对象不是“物理上”const,那么C ++允许您使用const_cast
来修改它,以绕过保护。
即使类对象本身(或用于访问它的引用或指针)是mutable
,也可以修改const
类成员。这方面的良好用途的示例是在读取操作期间必须被锁定的互斥锁,以及用于存储昂贵的读取操作的结果的高速缓存。在这两种情况下,操作本身应该是const
函数(因为它不会影响对象的可见状态),但它需要修改互斥锁或缓存,因此这些函数需要{{1 }}。它也可能被滥用,使物体在逻辑上不应该明显改变,所以要小心使用它;如果成员mutable
不属于外部可见状态的一部分,则仅声明成员{。}}。
答案 1 :(得分:17)
当对象中的字段可以被视为“内部”时,您需要mutable
,即该类的任何外部用户都无法确定这些字段的值。即使实例被认为是常量,即不改变,该类可能需要写入这些字段。
考虑硬盘;它的缓存就是这种状态的一个例子。当数据从实际磁盘读取时,缓存被写入。
如果没有相应的成员mutable
,就无法在C ++中干净地表达,即使在标记为const
的方法中也允许更改它们。正如评论中所指出的那样,您总是可以找到锤子并使用const_cast<>
删除const
- 但这当然是作弊。 :)
答案 2 :(得分:1)