2012-01-03 92 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