本文へスキップ
BecomeCoder

C++コース · 第9章 参照とconst ― 効率と安全のかなめ · レッスン36

const ― 変更を禁止して守る

ブラウザで完結

導入

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 を付ける」を基本にすると、意図が明確でバグに強いコードになります。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。