const 修飾子は、データ・オブジェクトを変更できないものとして明示的に宣言します。初期化を行うときに、この値がセットされます。
変更可能な左辺値を必要とする式には、const データ・オブジェクトを使用することはできません。
例えば、const データ・オブジェクトは、代入ステートメントの左辺では使用できません。
const として宣言されたオブジェクトは、プログラムの実行全体に渡ってではなく、その 存続時間に定数として残ることが保証されます。 このため、const オブジェクトは定数式では使用できません。 以下の例では、const オブジェクト k は、foo 内で宣言され 、foo の引き数の値へ初期化され、関数が戻るまで定数として残ります。 C では、k は、foo が呼び出されるまで未知のため、配列長を指定するた めには使用できません。
void foo(int j) { const int k = j; int ary[k]; /* Violates rule that the length of each array must be known to the compiler */ }
C では、ブロックの外側で宣言された const オブジェクトは外部結合を持ち、ファ イル間で共用することができます。 以下の例では、k は、おそらく別のファイルで定義されているため、配列長の指定に使 用することはできません。
extern const int k; int ary[k]; /* Another violation of the rule that the length of each array must be known to the compiler */
明示的なストレージ・クラスのない const オブジェクトのトップレベル宣言は 、C++ では static と見なされますが、C では extern と見なされます。
const int k = 12; /* Different meanings in C and C++ */ static const int k2 = 120; /* Same meaning in C and C++ */ extern const int k3 = 121; /* Same meaning in C and C++ */
C++ では、外部で定義された定数を参照するものを除き、すべての const 宣言が初期化指定子を持たなければなりません。
このセクションでのここから先の説明は、C++ だけに適用されます。
const オブジェクトが整数で、定数に初期化されている場合 、これを定数式で表示することができます。 次の例は、このことを示しています。
const int k = 10; int ary[k]; /* allowed in C++, not legal in C */
C++ では、const オブジェクトはデフォルトで内部結合を持つため、 const オブジェクトをヘッダー・ファイルで定義することができます。
ポインター用のキーワード const は、型の前か後、もしくは 前後ともに表示することができます。 使用できる宣言は以下のとおりです。
const int * ptr1; /* A pointer to a constant integer: the value pointed to cannot be changed */ int * const ptr2; /* A constant pointer to integer: the integer can be changed, but ptr2 cannot point to anything else */ const int * const ptr3; /* A constant pointer to a constant integer: neither the value pointed to nor the pointer itself can be changed */
オブジェクトを const と なるよう宣言することは、this ポインターが const オブジェクトを指すポインターで あることを意味します。const this ポインターは、const メンバー関数を使うときのみに使用できます。
const メンバー関数
メンバー関数 const を宣言することは、this ポインターが const オブジェクトを 指すポインターであることを意味します。 クラスのデータ・メンバーは、関数内で const になります。関数は、値をまだ変更することができますが、その ためには const_cast が必要です。
void foo::p() const{ member = 1; // illegal const_cast <int&> (member) = 1; // a bad practice but legal }
もっといい方法は、member mutable を宣言することです。
関連参照