導入
const は「これは変更しない」という宣言です。うっかりの書き換えをコンパイラが止めてくれるため、大きなプログラムほど価値が上がります。「const correctness(const 正しさ)」は実務 C++ の基本作法です。
説明
変数に付ければ定数になり、あとから代入するとコンパイルエラーになります。
#include <iostream>
using namespace std;
int main() {
const int MAX = 100;
cout << MAX << endl;
// MAX = 200; // ← コンパイルエラー(const は書き換え不可)
const double PI = 3.14159;
double area = PI * 2 * 2;
cout << area << endl; // 12.5664
return 0;
}
ポインタと const の組み合わせは、位置によって意味が変わります。「何が変えられないのか」を読み分けられるようにしておきましょう。
flowchart TB a["const int* p<br/>指す先の値を変えられない<br/>(p 自体は付け替え可)"] b["int* const p<br/>p の指す先を変えられない<br/>(値は書き換え可)"] c["const int* const p<br/>どちらも変えられない"] a --- b --- c
#include <iostream>
using namespace std;
int main() {
int a = 1, b = 2;
const int* p = &a; // *p は変えられない
// *p = 10; // ← エラー
p = &b; // p の付け替えは OK
int* const q = &a; // q の付け替えはできない
*q = 10; // 値の書き換えは OK
cout << a << endl; // 10
return 0;
}
前レッスンの const vector<int>&(読み取り専用の参照渡し)も、この const の応用です。引数・戻り値・メンバ関数に const を付ける習慣が、バグの少ないコードにつながります。
まとめ
const は「変えない」を型で表明する道具です。定数・const 参照・const ポインタを使い分け、「変更しないものには const を付ける」を基本にすると、意図が明確でバグに強いコードになります。