阅读了这篇文章后,我理解声明一个方法为const
可以防止它意外修改类的成员变量。
const
方法常用吗?- 所有不应修改成员变量的方法都应该使用const吗?
这是我的亲身经历。
几年前,我一直反对使用const,只是因为在设计和编写更长的函数签名时有所限制等等...
但我的一个项目领导者总是坚持不懈地提醒我:“你应该使用const函数,它可以避免意外和无意义的操作。”
有一天,我面临着一个难以解决的bug。日复一日,夜复一夜......简直是一场噩梦。设计对我来说太大了,我无法完全掌握它。我白费力气地搜索,最终决定我已经迷失了。
然后我花了两天时间重新定义所有应该是const的函数。我的意思是,两天时间。(重新编译需要很长时间,因为这是一个500万行代码的项目。)
然后:我找到了那个bug......或者说是编译器帮我找到了那个bug:在一个类似getter的方法中,本应该给我一个GUI控件的首选大小,但实际上代码计算了大小,同时还缓存了大小并更新了大小......从而修改了对象。
现在,有时候我会忘记加const。但如果我注意到了,我就会改正它。
将const
添加到成员函数中,允许在常量引用对象上调用它,因为它保证实例变量不会被更改。在STL的各个地方都存在常量引用,因此,在函数不打算修改对象状态的情况下,将成员函数标记为const是有意义的。
注意:可以将某些实例变量标记为mutable
,以便即使在const函数中也可以更改它们。例如,这对于实现查找缓存非常有用。
声明一个不应修改成员变量的方法:
因此,在任何有意义的地方都要使用 const
。尽管如此,它们并没有被广泛使用,很可能是因为大多数开发人员没有看到巨大的好处。
如果您忘记将访问器标记为const
,编译器将不允许在const
对象或对const
对象的引用上调用该方法。因此,标记访问器为const
确实很重要。
尽可能使用const关键字。
它可以防止代码中的错误。
它大大提高了代码的可读性。 每个阅读头文件并看到const关键字的人都可以立即理解const方法不会改变对象的状态,并且可以在不担心更改对象的情况下使用,例如。