web-dev-qa-db-ja.com

値渡し時に「定数」は冗長ではありませんか?

キューブの体積を計算する関数に出会ったとき、C++の本(Deitel)を読んでいました。コードは次のとおりです。

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

「const」修飾子の使用に関する説明は次のとおりです。「const修飾は、最小限の特権の原則を実施するために使用し、関数が変数側を変更しないことをコンパイラーに伝えます」。

私の質問:変数が値で渡されているため、ここでは「const」の冗長/不必要な使用ではないので、関数はそれを変更できませんか?

72
Daniel Scocco

const修飾子は、関数内のコードがパラメーター自体を変更するのを防ぎます。関数が自明なサイズよりも大きい場合、このような保証は、関数をすばやく読み、理解するのに役立ちます。 sideの値が変わらないことがわかっている場合は、読みながら値を経時的に追跡する必要はありません。状況によっては、これはコンパイラがより良いコードを生成するのに役立つこともあります。

それは一般的に良いスタイルだと考えると、自明ではない人の数は当然のこととしてこれを行います。

101

次のようなことができます:

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

}
49
psur