データ宣言を変更すると、 const キーワードは、オブジェクトまたは変数が変更できないことを指定します。
構文
declarator:
ptr-declarator
noptr-declaratorparameters-and-qualifierstrailing-return-type
ptr-declarator:
noptr-declarator
ptr-operatorptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seq選ぶ
noptr-declaratorparameters-and-qualifiers
noptr-declarator[constant-expressionopt]attribute-specifier-seq選ぶ
(ptr-declarator)
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seq選ぶ
ref-qualifieroptnoexcept-specifieroptattribute-specifier-seq選ぶ
trailing-return-type:
->type-id
ptr-operator:
*attribute-specifier-seqoptcv-qualifier-seq選ぶ
&attribute-specifier-seq選ぶ
&&attribute-specifier-seq選ぶ
nested-name-specifier*attribute-specifier-seqoptcv-qualifier-seq選ぶ
cv-qualifier-seq:
cv-qualifiercv-qualifier-seq選ぶ
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...選ぶid-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の詳細については、次の記事を参照してください。