逻辑和物理常数之间的差异

时间:2010-09-30 12:13:48

标签: c++

这两个术语有什么区别,为什么我需要mutable

3 个答案:

答案 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)

Scott Meyers,Effective C++,第3项:

尽可能使用const

对此主题进行了很好的讨论(有例子)。很难写得比斯科特好!

另请注意,物理常数也称为按位常量。