const 型修飾子

C 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++ このセクションでのここから先の説明は、C++ だけに適用されます。

const オブジェクトが整数で、定数に初期化されている場合 、これを定数式で表示することができます。 次の例は、このことを示しています。

const int k = 10;
int ary[k];     /* allowed in C++, not legal in C */
 

C++ では、const オブジェクトはデフォルトで内部結合を持つため、 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 を宣言することです。

関連参照

IBM Copyright 2003