【发布时间】:2012-02-07 22:13:44
【问题描述】:
在处理内存数据结构时,我经常使用const 并保持我的代码正确,但我不确定const 应该如何应用于更复杂的对象,例如:
- 表示与远程系统的连接的对象
- 由数据库支持的对象(可以按需从数据库中加载部分)
- 由磁盘目录树支持的对象(可以访问由单独的对象层次结构控制的目录树)
const 方法对于此类对象应该表示什么?我能想到几种可能性:
- "strict" const - 不修改任何内存状态的方法是 const。但是,这似乎会破坏封装,因为它需要调用者知道哪些方法会修改连接状态,哪些不会。
- "logical" const - 不修改对象逻辑状态的方法是 const。但是,这可能需要将大量状态和缓存变量标记为
mutable。虽然我意识到这就是mutable的设计目的,但使用它感觉就像是一种 hack。此外,鉴于 const 的意思是“我保证不会修改它”,当方法可能以奇怪而奇妙的方式(只要它们保持封装)修改连接状态时应用它似乎不正确,缓存结果为随心所欲,在连接失败时抛出异常等。 - 没有 const - 鉴于前面的问题,const 对更复杂的对象没有太大意义吗?
哪种方法最有用?哪个最常见?
【问题讨论】:
-
这似乎与我不久前提出的一个问题有关:stackoverflow.com/questions/5208184/…。
-
主观,但我想说如果你有一个数据库连接对象,我会让
const引用连接的参数:重新连接、关闭等应该是变异操作。另一方面,执行查询可能是const。因此对对象的 const 引用可以执行查询但不能关闭连接。 (当然连接总是可以从另一端关闭。)