说你有:
int f( const T a ) { ... }
int g( const T &a ) { ... }
我理解在const
中使用g
:我们不知道a
如何在函数外部使用,因此我们希望保护它不被修改。但是,我不理解在const
中使用f
,其中a
是本地副本。为什么我们需要保护它不被修改?
答案 0 :(得分:4)
我可以想到几个原因:
1)当有人阅读代码并查看const T a
时,他们知道不应在函数正文中修改a
。
2)当您尝试修改函数体中的a
时,编译器会告诉您。因此,添加const
可以防止错误。
BTW克里斯已经在评论中提到了这一点。
3)然而,C ++ 11还有另一个不同之处。当移动操作修改对象时,无法移动常量对象。因此,您只能在函数体中复制a
,并且不能从中移动。
4)另外,如果这是一个类类型,则不能在const对象上调用非const成员函数。
答案 1 :(得分:1)
“我个人倾向于不使用const,除了参考和指针参数。对于复制的对象,它并不重要” 如果在函数参数中使用const,则可能是以下原因之一。 1 - 它有助于编译器稍微优化一下。 2 - 未来没有人可以修改参数值(如果许多人在相同的代码库上工作)
答案 2 :(得分:0)
声明变量const是一种很好的做法。
<强> WHY吗
对于通过值传递给函数的参数,调用者无论是否声明它const
都无关紧要。这里的基本原理是在编码时保护自己免受错误,使用编译器警告您正在更改变量的值,以便您可以通过删除const
修饰符来明确确认此行为。这不仅适用于函数参数,也适用于局部变量。
基于这个基本原理,我个人总是首先声明所有变量const
并让编译器在修改它们时发出错误。然后我检查是否有这种行为,如果确实需要,则删除const
修饰符。为了更好的易读性,我也总是喜欢以我的变量全部为const
的方式进行编码。