const (C++)

データ宣言を修飾するとき、const キーワードで、オブジェクトまたは変数が変更できないことを指定します。

構文

declarator:
ptr-declarator
noptr-declarator parameters-and-qualifiers trailing-return-type
ptr-declarator:
noptr-declarator
ptr-operator ptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seqopt
noptr-declarator parameters-and-qualifiers
noptr-declarator[constant-expressionopt]attribute-specifier-seqopt
( ptr-declarator )
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seqopt
ref-qualifieroptnoexcept-specifieroptattribute-specifier-seqopt
trailing-return-type:
-> type-id
ptr-operator:
*attribute-specifier-seqoptcv-qualifier-seqopt
&attribute-specifier-seqopt
&&attribute-specifier-seqopt
nested-name-specifier*attribute-specifier-seqoptcv-qualifier-seqopt
cv-qualifier-seq:
cv-qualifiercv-qualifier-seqopt
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...optid-expression

const

const キーワードは、変数の値が定数であることを指定し、プログラマによる変更を防止するようにコンパイラに指示します。

// constant_values1.cpp
int main() {
   const int i = 5;
   i = 10;   // C3892
   i++;   // C2105
}

C++ では、#define プリプロセッサ ディレクティブの代わりに const キーワードを使用して定数値を定義できます。 const で定義されている値は型チェックの対象になり、定数式の代わりに使用できます。 C++ では、次のように const 変数で配列のサイズを指定できます。

// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray];  // allowed in C++; not allowed in C

C では、定数値は既定で外部リンケージに設定されるため、ソース ファイルでのみ指定できます。 C++ では、定数値は既定で内部リンケージに設定されるため、ヘッダー ファイルで指定できます。

const キーワードは、ポインター宣言でも使用できます。

// constant_values3.cpp
int main() {
   char this_char{'a'}, that_char{'b'};
   char *mybuf = &this_char, *yourbuf = &that_char;
   char *const aptr = mybuf;
   *aptr = 'c';   // OK
   aptr = yourbuf;   // C3892
}

const として宣言されている変数へのポインターは、const としても宣言されたポインターにのみ割り当てることができます。

// constant_values4.cpp
#include <stdio.h>
int main() {
   const char *mybuf = "test";
   char *yourbuf = "test2";
   printf_s("%s\n", mybuf);

   const char *bptr = mybuf;   // Pointer to constant data
   printf_s("%s\n", bptr);

   // *bptr = 'a';   // Error
}

定数データへのポインターを関数パラメーターとして使用して、ポインターを通じて渡されるパラメーターが関数によって変更されないようにすることができます。

const として宣言されたオブジェクトの場合、定数メンバー関数のみ呼び出すことができます。 コンパイラによって、定数オブジェクトが変更されることは決してありません。

birthday.getMonth();    // Okay
birthday.setMonth( 4 ); // Error

非定数オブジェクトに対して、定数または非定数のメンバー関数を呼び出すことができます。 また、const キーワードを使用してメンバー関数をオーバーロードすることもできます。この機能によって、定数および非定数オブジェクトに対して関数の異なるバージョンが呼び出されるようになります。

const キーワードを持つコンストラクターまたはデストラクターは宣言できません。

const メンバー関数

const キーワードを指定してメンバー関数を宣言すると、その関数は呼び出したオブジェクトを変更しない "読み取り専用" 関数であると指定されます。 定数メンバー関数は、非静的データ メンバーを変更したり、定数でないメンバー関数を呼び出すことはできません。 定数メンバー関数を宣言するには、引数リストの閉じかっこの後に const キーワードを追加します。 const キーワードは、宣言と定義の両方で必要になります。

// constant_member_function.cpp
class Date
{
public:
   Date( int mn, int dy, int yr );
   int getMonth() const;     // A read-only function
   void setMonth( int mn );   // A write function; can't be const
private:
   int month;
};

int Date::getMonth() const
{
   return month;        // Doesn't modify anything
}
void Date::setMonth( int mn )
{
   month = mn;          // Modifies data member
}
int main()
{
   Date MyDate( 7, 4, 1998 );
   const Date BirthDate( 1, 18, 1953 );
   MyDate.setMonth( 4 );    // Okay
   BirthDate.getMonth();    // Okay
   BirthDate.setMonth( 4 ); // C2662 Error
}

C と C++ const の違い

C ソース コード ファイルで変数を定義 const する場合は、次のように行います。

const int i = 2;

そして、次のように、この変数を別のモジュールで使用できます。

extern const int i;

ただし、C++ で同じ動作を得るには、変数を const 次のように定義する必要があります。

extern const int i = 2;

C と同様に、次のように別のモジュールでこの変数を使用できます。

extern const int i;

C++ ソース コード ファイルで使用する extern 変数を C++ ソース コード ファイルで定義する場合は、次の値を使用します。

extern "C" const int x=10;

C++ コンパイラによる名前修飾を防止します。

解説

メンバー関数のパラメーター リストの後に続く場合、const キーワードは関数が呼び出しの対象であるオブジェクトを変更しないことを指定します。

const の詳細については、次の記事を参照してください。

関連項目

キーワード