在阅读this之后,我理解将方法声明为const
会阻止它意外修改类的成员变量。
const
方法吗?答案 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)
声明不应修改成员变量的方法:
所以是的,在有意义的地方使用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方法不会改变对象的状态,并且可以使用而不用担心他会改变对象,例如