常数成员函数
是的,应该总是使用const
。
它让你的编译器检查你的应用程序逻辑,静态断言const-correctness是免费的!
有人甚至认为const
应该是默认值,并且您应该被迫使用mutable
来表示非常数。
我广泛使用const来传达设计意图。如果我打算一个方法是一个纯粹的查询,而不是修改函数,那么我会强制执行该方法并在签名中使用'const'进行通信。
我鼓励你看看梅耶关于无副作用函数问题的想法,以及对启用测试的影响。
将const
添加到成员函数允许它在一个对象的const引用上被调用,因为它保证实例变量不会被改变。 const引用出现在整个STL的各个位置,所以在函数不打算修改对象状态的地方将成员函数标记为const是有意义的。
注意:可以将某些实例变量标记为mutable
,以便即使通过const函数也可以更改它们。例如,这对于实现查找缓存非常有用。
声明是不应该修改成员变量的方法:
- 保证,你认为什么是正在发生的事情,即你没有意外修改变量的地方。
- 向函数的调用者声明此方法不会修改成员变量,不需要阅读代码或依赖于说明如此的文档。
所以是的,只要有意义,请使用const
。他们没有像我希望看到的那样广泛使用,很可能是因为大多数开发人员没有看到巨大的收益。
如果您忘记将访问器标记为const
,则编译器将不允许在const
对象上调用该方法或对const
对象的引用进行调用。所以是的,标记访问器为const
是重要。
如果您有一个类对象的const引用或指针(即指向const的指针),那么您只能调用该类的const成员方法。因此,如果某人“忘记”制作一个“get”方法const,那么您将无法使用const引用来调用它(const_cast有一个解决方法,但我们不想使用它!)。
所以是的,如果该类不会被该方法修改,那么它应该是const。
注意:有些情况下,您确实想要将变量修改为“实现细节”,例如延迟加载或锁定互斥锁。在这种情况下,您仍然可以使该方法为const,但将该成员变量设置为“mutable”。
如果你正在编写一个虚拟方法,它应该是const,如果没有派生类需要它是可变的。
您应尽可能使用const关键字。
它防止你从代码中的错误。
它增加了代码的可读性。 大家谁是阅读的头,看到常量的关键字可以立即明白,一个const方法不改变对象的状态,并可以在不害怕他会改变的对象,例如
只是我的证词中使用。
若干年前,我还是反对使用const,因为在设计和书写较长的函数签名...等的限制只是...
但我的项目领导人之一始终坚持,一直提醒着我:“你应该使用const函数,它避免了事故和无意义”。
而且有一天我遇到了不可能找不到。几天之后的日子......一场噩梦。这个设计对我来说太大了,因为我能够把握它的整体。我徒劳地搜寻,直到我决定我迷路了。
然后,我花了两天重新定义所有的功能应该是const。我的意思是,两天。 (重新编译只要是一个500万行的代码项目)。
然后:只是我发现了错误...而是编译器找到了我的错误:在类似getter的方法中,应该给我gui控件的首选大小,代码实际上是计算大小,但它也缓存其大小和更新其大小...因此修改对象。
现在,有时我忘了把常量。但如果我注意到它,我会纠正它。
另外,你可以在函数的`const`限定符上重载函数。例如,这允许一个索引操作符,如果该对象被声明为`const`,它将自动以只读*方式返回该元素。 [*只读仍然只适用于编译时,但。 `const`在运行时不能做任何事情] – Mephane 2011-01-14 13:13:46
+1对于const正确性。没有人提到它 – 2011-01-14 13:15:15
我在考虑你的陈述“const作为默认值,并且可变为非常量”。看起来像一个极端的位置,但我会尝试去感受我的想法。 – 2011-01-14 13:32:23