【问题标题】:Isn't "const" redundant when passing by value? [duplicate]按值传递时“const”不是多余的吗? [复制]
【发布时间】: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++ 可能也一样吗?

标签: c++ constants pass-by-value


【解决方案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的问题无关。
猜你喜欢
  • 2011-11-21
  • 2016-10-02
  • 2017-02-22
  • 2011-12-15
  • 2013-02-09
  • 2013-05-03
  • 1970-01-01
  • 2013-01-21
  • 2020-06-02
相关资源
最近更新 更多