参照の復習と深掘り

参照 vs ポインタ。参照の本質。

概要

Phase 3で参照を学びましたが、ここではより深く掘ります。 参照とポインタの違い、参照の制約、 なぜ参照が安全で便利なのかを理解します。

参照とポインタの比較

参照は、ポインタの安全な代替案です。

項目 参照 ポインタ
初期化 必須 オプション
再代入 不可 可能
Null値 なし 可能
算術演算 不可 可能

参照の制約

#include <iostream>

int main() {
    int x = 10;
    
    // 参照は必ず初期化
    int& ref = x;
    // int& ref;  // エラー! 初期化なし
    
    // 参照は再代入できない
    int y = 20;
    ref = y;  // これは y の値 20 を x に割り当てる(参照の変更ではない)
    std::cout << x << std::endl;  // 20
    
    // 参照は Null になれない
    // int& nullRef = nullptr;  // エラー!
    
    return 0;
}

20

参照と関数

#include <iostream>

// 参照を使った値の交換
void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 5, y = 10;
    swap(x, y);
    std::cout << x << " " << y << std::endl;
    return 0;
}

10 5

参照をパラメータにすれば、 ポインタの煩雑さなく元の値を修正できます。

const参照

#include <iostream>

void printValue(const int& ref) {
    std::cout << ref << std::endl;
    // ref = 100;  // エラー! const参照は修正不可
}

int main() {
    int x = 42;
    printValue(x);
    
    // const参照は一時オブジェクトへの参照も可能
    printValue(100);
    
    return 0;
}

42
100

const参照は最も安全で効率的なパラメータ渡し方法です。

ポイント

  • 参照は自動的に非参照化される安全な指針
  • 参照は必ず初期化が必須
  • 参照は再代入不可(再割り当て不可)
  • const参照が最も効率的な値渡し方法

よくある誤り

誤り: 参照の配列を作ろうとする

int x = 5, y = 10;
int& arr[] = {x, y};  // エラー! 参照の配列は作成不可

誤り: 参照を再代入した際の混乱

int x = 5, y = 10;
int& ref = x;
ref = y;  // ref は依然として x を指す。x の値が y に変わったのみ。

まとめ

  • 参照は型安全なポインタの代替
  • 参照は初期化必須、再代入不可
  • const参照で効率と安全を両立