常数成员函数

时间:2011-01-14 13:03:16

标签: c++ class methods const member

在阅读this之后,我理解将方法声明为const会阻止它意外修改类的成员变量。

  • 常用const方法吗?
  • 它们是否应该用于所有不应修改成员变量的

8 个答案:

答案 0 :(得分:14)

是的,在适当的时候,应始终使用const

它允许您的编译器检查您的应用程序逻辑,免费静态断言const-correctness

有些人甚至说const应该是默认值,你应该被迫使用mutable作为非常数。

答案 1 :(得分:6)

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

我鼓励您看看迈耶关于无副作用功能的问题,以及对实现测试的影响。

答案 2 :(得分:4)

我的证词。

几年前,我仍然反对使用const,只是因为设计上的限制和编写更长的函数签名......等等......

但是我的一位项目负责人总是坚持,一直提醒我:“你应该使用const功能,它可以避免事故和无意义”。

有一天,我遇到了不可能的错误。几天后的几天......一场噩梦。设计对我来说太大了,所以我可以把它整体抓住。我徒劳无功地搜索,直到我决定失去了。

然后我花了两天时间重新定义所有应该是const 的函数。我的意思是,两天。 (重新编译很长,因为它是500万行代码项目)。

然后:只是我发现了这个错误...而编译器为我找到了这个错误:在类似getter的方法中,应该给我一个gui控件的首选大小,代码实际上是在计算大小,但它也缓存了它的大小并更新了它的大小......因此修改了对象。

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

答案 3 :(得分:1)

const添加到成员函数允许在对象的const引用上调用它,因为它保证不会更改实例变量。 const引用发生在整个STL的各个地方,因此将成员函数标记为const是有意义的,其中函数不打算修改对象的状态。

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

答案 4 :(得分:1)

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

  1. 确保您认为正在发生的事情,即您不会在某处意外修改变量。
  2. 向函数的调用者声明此方法不会修改成员变量,无需读取代码或依赖于这样说明的文档。
  3. 所以是的,在有意义的地方使用const。它们并没有像我希望的那样广泛使用,很可能是因为大多数开发人员没有看到巨大的好处。

答案 5 :(得分:1)

如果忘记将访问者标记为const,编译器将不允许在const个对象上调用该方法或对const个对象的引用。所以是的,将访问者标记为const 非常重要。

答案 6 :(得分:1)

如果你有一个类引用的const引用或指针(即指向const的指针),那么你只能调用该类的const成员方法。

因此,如果有人“忘记”制作一个“获取”方法const,你将无法使用const引用调用它(有一个const_cast的解决方法,但我们不想使用它!)。 / p>

所以是的,如果该方法不会被该方法修改,那么它应该是const。

注意:在某些情况下,您确实希望将变量修改为“实现细节”,例如延迟加载或锁定互斥锁。在这种情况下,您仍然可以使方法成为const,但使该成员变量“可变”。

如果你正在编写一个虚方法,如果没有派生类需要它是可变的,它应该是const。

答案 7 :(得分:1)

您应该尽可能使用const关键字。

它可以防止您在代码中出错。

它极大地提高了代码的可读性。 每个正在阅读标题并查看const关键字的人都可以立即理解const方法不会改变对象的状态,并且可以使用而不用担心他会改变对象,例如