常数成员函数

问题描述:

在阅读this之后,我的理解是将方法声明为const可以防止它意外修改类的成员变量。常数成员函数

  • const方法常用?
  • 它们应该用于什么都不应该修改成员变量

是的,应该总是使用const

它让你的编译器检查你的应用程序逻辑,静态断言const-correctness是免费的!

有人甚至认为const应该是默认值,并且您应该*使用mutable来表示非常数。

+1

另外,你可以在函数的`const`限定符上重载函数。例如,这允许一个索引操作符,如果该对象被声明为`const`,它将自动以只读*方式返回该元素。 [*只读仍然只适用于编译时,但。 `const`在运行时不能做任何事情] – Mephane 2011-01-14 13:13:46

+0

+1对于const正确性。没有人提到它 – 2011-01-14 13:15:15

+0

我在考虑你的陈述“const作为默认值,并且可变为非常量”。看起来像一个极端的位置,但我会尝试去感受我的想法。 – 2011-01-14 13:32:23

我广泛使用const来传达设计意图。如果我打算一个方法是一个纯粹的查询,而不是修改函数,那么我会强制执行该方法并在签名中使用'const'进行通信。

我鼓励你看看梅耶关于无副作用函数问题的想法,以及对启用测试的影响。

const添加到成员函数允许它在一个对象的const引用上被调用,因为它保证实例变量不会被改变。 const引用出现在整个STL的各个位置,所以在函数不打算修改对象状态的地方将成员函数标记为const是有意义的。

注意:可以将某些实例变量标记为mutable,以便即使通过const函数也可以更改它们。例如,这对于实现查找缓存非常有用。

声明是不应该修改成员变量的方法:

  1. 保证,你认为什么是正在发生的事情,即你没有意外修改变量的地方。
  2. 向函数的调用者声明此方法不会修改成员变量,不需要阅读代码或依赖于说明如此的文档。

所以是的,只要有意义,请使用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控件的首选大小,代码实际上是计算大小,但它也缓存其大小和更新其大小...因此修改对象。

现在,有时我忘了把常量。但如果我注意到它,我会纠正它。