本文へスキップ
BecomeCoder

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

参照 ― 変数に別名をつける

ブラウザで完結

導入

第6章ではポインタ(住所)を学びました。C++ には、それをもっと簡単に書ける「参照(reference)」があります。参照は「ある変数の別名」で、実務のコードに大量に出てきます。

説明

型& 名前 = 変数; と書くと、その変数の別名を作れます。別名を書き換えると、元の変数も変わります。ポインタと違って *&(アドレス)を書かずに、ふつうの変数のように使えます。

flowchart LR
  a["int a = 10;"]
  r["int&amp; r = a;<br/>(a の別名)"]
  r -->|"r = 20; と書くと"| a2["a も 20 になる"]
#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int& r = a;      // r は a の別名(参照)
    r = 20;          // r を変えると…
    cout << a << endl;   // 20(a も変わる)

    int* p = &a;     // 参考:ポインタなら & と * が必要
    *p = 30;
    cout << a << endl;   // 30
    return 0;
}

参照は「宣言と同時に必ず初期化」し、後から別の変数を指すことはできません。この単純さが、ポインタより安全と言われる理由です。

まとめ

参照は「変数の別名」。ポインタのように住所を意識せず書けて、nullptr(どこも指さない)になりようがないぶん安全です。次のレッスンで、参照のいちばんの使い道「参照渡し」を学びます。

実際に動かしてみよう

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

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

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