正如John Dibling所说,将被更改的字段标记为可变的。 ypnos的评论中的重要部分是:实际上不要改变对象的状态(在外界看来)。也就是说,在const方法调用之前和之后的任何方法调用必须产生相同的结果。否则,您的设计存在缺陷。
有些可以改变的事情:
- mutex or other lock types
- cached results (that will not change)
互斥锁不是你的对象状态的一部分,它们只是阻止机制,以确保数据完整性。从你的类中检索值的方法确实需要更改互斥锁,但是在常量方法执行后,你的类数据和状态将与之前完全相同。
通过缓存,你必须考虑到只有那些昂贵得去检索而且被假定不会改变的数据(比如DNS结果)才有意义。否则你可能会向用户返回过期的数据。
一些在const方法内不应更改的东西:
- Anything that modifies the state of
the object
- Anything that affects this or other
method results
你的类的任何使用const方法的用户都会假定你的类(从外部世界看)在执行期间不会改变。如果不是这样,这将是非常误导性和容易出错的。例如,假设一个dump()方法改变了一些内部变量-状态、值-并且在调试期间,你的类的用户决定在给定的点中dump()你的对象:你的类将会在跟踪和没有跟踪的情况下表现不同:完美的调试噩梦。
请注意,如果您使用懒惰优化,必须对可变数据进行访问。也就是说,如果您的接口规定在构建期间将从数据库检索元素,然后可以通过常量方法访问该元素,那么如果您对数据进行懒惰获取,最终可能会发生这样的情况:用户构建对象以保留旧数据的副本,修改数据库,然后决定将先前的数据恢复到数据库中。如果您执行了懒惰获取,则最终将丢失原始值。与之相反的例子是配置文件解析,如果不允许在程序执行期间修改配置文件,则可以避免在需要的时候解析文件,因为始终在开头或稍后读取将产生相同的结果。