按值传递时“const”不是多余的吗? [复制]
Posted
技术标签:
【中文标题】按值传递时“const”不是多余的吗? [复制]【英文标题】:Isn't "const" redundant when passing by value? [duplicate] 【发布时间】:2012-02-01 14:38:03 【问题描述】:我在阅读我的 C++ 书籍 (Deitel) 时遇到了一个计算立方体体积的函数。代码如下:
double cube (const double side)
return side * side * side;
使用“const”限定符的解释是这样的:“const 限定符应该用于强制执行最小权限原则,告诉编译器函数不修改变量端”。
我的问题:这里使用“const”不是多余/不必要的,因为变量是按值传递的,所以函数无论如何都不能修改它?
【问题讨论】:
这里const
的意思是不能修改cube()
方法内部的side
参数,以免出现意外行为。
有时事情更多的是“良好实践”而不是必要性。我认为这是其中之一。
我认为答案很好地解释了你为什么要这样做,但我只是将它添加到外部调用者中,const
是 多余的并且不是函数签名的一部分。这意味着您可以在函数声明中将其关闭,而无需更改任何内容。如果由于某种原因你想让你的代码更难维护,你也可以稍后删除它,并且它不会影响调用代码。
我不喜欢它的一件事是它迫使我要么 (a) 使 const
在声明中可见,但它没有意义,或者 (b) 使声明和定义不一致。我想解决办法是克服我对 (b) 的疑虑。
在 Java 中,在函数内声明匿名类时,需要在同一位置使用 final
关键字才能使闭包正常工作。 C++ 可能也一样吗?
【参考方案1】:
const
限定符可防止函数内的代码修改参数本身。当函数大于平凡大小时,这种保证可以帮助您快速阅读和理解函数。如果您知道side
的值不会改变,那么您不必担心在阅读时跟踪它的值。在某些情况下,这甚至可以帮助编译器生成更好的代码。
考虑到这通常是一种很好的风格,有不少人这样做是理所当然的。
【讨论】:
为什么是“也”?这就是它的全部。 @KeithThompson -- 事实上,这就是它所做的一切,但 O.P. 正在考虑 const ref 参数,const
阻止您更改原始对象。
“在某些情况下,这甚至可以帮助编译器生成更好的代码。”需要引用。
我仍然认为它是多余的。如果你发现它在大型函数中很有用,那么你的函数有问题,而不是你的参数。【参考方案2】:
你可以这样做:
int f(int x)
x = 3; //with "const int x" it would be forbidden
// now x doesn't have initial value
// which can be misleading in big functions
【讨论】:
@snakedoctor 坏人。坏人这样做。 :) 与OP的问题无关。以上是关于按值传递时“const”不是多余的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章