型修飾子

C は、3 つの型修飾子 constvolatile、および restrict を認識します。C++ は、型修飾子 const および volatilecv-qualifiers として参照し、型修飾子 restrict を言語拡張として認識します。いずれの言語においても、cv-qualifiers は左辺値の式でのみ意味があります。 C++ では、C では許可されない関数に cv-qualifier を適用することができます。 型修飾子 restrict はポインターにのみ適用できます。

const および volatile キーワードの構文

volatile または const ポインターの場合は 、* と ID の間にキーワードを入れる必要があります。次に例を示します。

      int * volatile x;        /* x is a volatile pointer to an int */
      int * const y = &z;      /* y is a const pointer to the int variable z */

volatile または const データ・オブジェクトを指すポインターの場合は、型 指定子、修飾子、およびストレージ・クラス指定子を任意の順序で使用できます。次に例を示します。

      volatile int *x;         /* x is a pointer to a volatile int
         or                                                         */
      int volatile *x;         /* x is a pointer to a volatile int  */
 
      const int *y;            /* y is a pointer to a const int
         or                                                         */
      int const *y;            /* y is a pointer to a const int     */

次の例では、y を指すポインターは定数です。 y が指す値は変更できますが、y の値は変更できません。

      int * const y

次の例では、y が指す値は定数整数で、この値は変更できません。 ただし、y の値は変更できます。

      const int * y

volatile および const 変数の他の型の場合は、定義 (または宣言) 内のキー ワードの位置は、あまり重要ではありません。次に例を示します。

      volatile struct omega {
                               int limit;
                               char code;
                            } group;

上記の例では、次の例のストレージと同じストレージを提供します。

      struct omega {
                      int limit;
                      char code;
                   } volatile group;

これらの例では、構造変数 group のみが volatile 修飾子を 受け取ります。同様に、volatile キーワードの代わりに const キーワードを 指定した場合は、構造変数 group のみが const 修飾子を 受け取ります。const および volatile 修飾子が 構造体、共用体、またはクラスに適用されるときは、構造体、共用体、またはクラスのメンバーにも 適用されます。

列挙型、クラス、構造体、および共用体変数は、volatile または const 修飾子を受け取ることができますが、列挙型、クラス、構造体、および共用体タグは、 volatile または const を持ちません。 例えば、以下の例で、blue 構造体は、volatile 修飾子を持ちません。

      volatile struct whale {
                           int weight;
                           char name[8];
                      } beluga;
      struct whale blue;

キーワード volatile および const は、 キーワード enumclassstruct、および union をそれらのタグから 分離できません。

volatile 関数または const 関数は、それが非静的メンバー関数で ある場合にのみ、宣言または定義できます。 どの関数も、volatile または const 関数を指すポインターを戻すように定義または宣言できます。

1 つの項目が、const および volatile の両方になり得ます。 この場合、その項目はそれ自体のプログラムによって正当に変更することはできないが、ある種の非同期処理に よって変更することはできます。

宣言には複数の修飾子を入れることができますが、 コンパイラーは重複型修飾子を無視します。 IBM Copyright 2003