2012-01-03 80 views
58

当我遇到函数来计算立方体的体积时,我正在阅读我的C++书籍(Deitel)。代码如下:传递值时不是“const”冗余吗?

double cube (const double side){ 
    return side * side * side; 
} 

使用“常量”限定词的解释是这样的:“在const修饰应该被用来执行最小特权原则,告诉该函数不修改编译器可变的一面“。

我的问题:是不是在这里使用“const”冗余/不必要,因为变量是通过值传递的,所以函数无法修改它?

+5

const'这里的'的意思是,你不能修改''里面立方体()'方法side'参数,以避免意外行为。 – 2012-01-03 15:09:10

+1

有时候事情更多的是关于“良好实践”而非必要性。我认为这是其中的一次。 – destan 2012-01-03 15:11:21

+2

我认为这些答案在解释你为什么这样做的过程中做了很好的工作,但我只是将它添加到外部调用者中,'const' *是*冗余的,不是函数签名的一部分。这意味着你可以在函数声明中不做任何改变。如果出于某种原因想要使代码更易维护,并且不会影响调用代码,也可以稍后将其删除。 – 2012-01-03 16:37:57

回答

82

const限定符可防止函数内的代码修改参数本身。当一个函数大于平凡的大小时,这样的保证可以帮助你快速阅读和理解一个函数。如果您知道side的价值不会改变,那么随着时间的推移,您不必担心随着时间的推移跟踪其价值。在某些情况下,这甚至可以帮助编译器生成更好的代码。

一个不重要的人会这样做,理所当然,因为它总体上是很好的风格。

+0

有道理。谢谢。 – 2012-01-03 15:10:16

+5

为什么“也”?这是*所有*它。 – 2012-01-03 18:12:44

+0

@KeithThompson - 事实上,就是这样,但O.P.正在考虑const ref参数,其中'const'使您不会更改原始对象。 – 2012-01-03 18:49:54

43

你可以做这样的事情:

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 

} 
+10

+1说明:) – 2012-01-03 15:17:21