我在处理内存数据结构时经常使用const
并保持我的代码const-correct,但我不确定const
应该如何应用于更复杂的对象,例如以下:
const
方法应该为这些对象表示什么?我可以想到几种可能性:
mutable
。虽然我意识到这是mutable
的设计目标,但使用它时,这感觉就像是一个黑客。另外,鉴于const意味着“我保证不会修改它”,当方法可能以奇怪和奇妙的方式修改连接状态时(只要它们保持封装),将它应用为缓存结果似乎是正确的。他们想要的就是,如果连接失败就抛出异常,等等。哪种方法最有用?哪个最常见?
答案 0 :(得分:2)
这是一个棘手的问题。我现在正在做同样的事情。我有一个由MySQL数据库支持的大型内存数据结构。我从一个“const尽可能”的方法开始,但事实证明这在实践中并不常见:
SELECT
语句实际上都是只读的。例如,SELECT GET_LOCK
肯定会修改数据库端的状态。mutable
的C ++程序员。我当然没有太多经验。未来的维护者可能会导致比可变解决方案更多的问题。你最了解你的团队,所以你是否想要走这条路是由你决定的。我认为对数据库具有单个可变句柄的const对象可能是最优雅的解决方案。确定const对象应该合理地做什么,并使所有这些函数成为const。您的类的用户只需要知道哪些函数是const,哪些不是。头文件将为他们提供。他们不应该知道为什么特定的函数是const还是非const。我确实同意,但是一堆可变成员开始看起来像个hackish。
在我的情况下,我基本上不得不放弃const正确性。一个const对象会被戴上手铐,以至于无法做任何有用的事情。根据我多年的经验,我怀疑这是实践中经常发生的事情。逻辑const正确性是一个很好的理想(,如果你从头开始构建,你肯定应该从那里开始),但是当涉及真实的,运输代码时,没有const是可行的方法。 / p>