定数値
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 *mybuf = 0, *yourbuf;
char *const aptr = mybuf;
*aptr = 'a'; // 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
}
出力
test
test
定数データへのポインターを関数パラメーターとして使用して、ポインターを通じて渡されるパラメーターが関数によって変更されないようにすることができます。
const として宣言されたオブジェクトの場合、定数メンバー関数のみ呼び出すことができます。 これによって、定数オブジェクトは変更されなくなります。
birthday.getMonth(); // Okay
birthday.setMonth( 4 ); // Error
非定数オブジェクトに対して、定数または非定数のメンバー関数を呼び出すことができます。 また、const キーワードを使用してメンバー関数をオーバーロードすることもできます。これによって、定数および非定数オブジェクトに対して関数の異なるバージョンが呼び出されるようになります。
const キーワードを持つコンストラクターまたはデストラクターは宣言できません。
C と C++ での const の相違点
C ソース コード ファイルで変数を const として宣言する場合は、次のようにします。
const int i = 2;
そして、次のように、この変数を別のモジュールで使用できます。
extern const int i;
しかし、C++ で同じ動作を得るには、次のように const 変数を宣言する必要があります。
extern const int i = 2;
C ソース コード ファイルで使用できるように C++ ソース コード ファイルで extern 変数を宣言する場合は、次のコードを使用してください。
extern "C" const int x=10;
C++ コンパイラによる名前修飾を防止します。