参照の復習と深掘り
参照 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参照で効率と安全を両立