按值传递时“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”不是多余的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

复制赋值运算符应该通过 const 引用还是按值传递?

按引用传递然后复制和按值传递在功能上是不是不同?

Java函数参数是不是总是按值传递数组? [复制]

请说明golang类型是不是按值传递

为啥对按值传递的参数使用 const? [复制]

为啥向量被视为按值传递,即使它是通过 const 引用传递的?