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-id
attribute-specifier-seq
opt
noptr-declarator
parameters-and-qualifiers
noptr-declarator
[
constant-expression
opt]
attribute-specifier-seq
opt
(
ptr-declarator
)
parameters-and-qualifiers
=
(
parameter-declaration-clause
)
cv-qualifier-seq
opt
ref-qualifier
optnoexcept-specifier
optattribute-specifier-seq
opt
trailing-return-type
=
->
type-id
ptr-operator
=
*
attribute-specifier-seq
optcv-qualifier-seq
opt
&
attribute-specifier-seq
opt
&&
attribute-specifier-seq
opt
nested-name-specifier
*
attribute-specifier-seq
optcv-qualifier-seq
opt
cv-qualifier-seq
=
cv-qualifier
cv-qualifier-seq
opt
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 ソース コード ファイルで使用できるように C++ ソース コード ファイルで extern
変数を定義する場合は、次のコードを使用してください。
extern "C" const int x=10;
C++ コンパイラによる名前修飾を防止します。
解説
メンバー関数のパラメーター リストの後に続く場合、const
キーワードは関数が呼び出しの対象であるオブジェクトを変更しないことを指定します。
const
の詳細については、次の記事を参照してください。