Java 只有引用傳遞(本質是指針值傳遞),沒有 C++ 情意的「引用」與「指針」雙重機制。本文從 Java 開發者視角,用對比方式梳理 C++ 引用的本質與差異。
| 特性 | C++ 指針 | C++ 引用 | Java 參考 |
|---|---|---|---|
| 可重新綁定 | ✅ 隨時 p = &other | ❌ 初始化後不可變 | ✅ 可指向新對象 |
| 可為空 | ✅ nullptr | ❌ 必須綁定有效對象 | ✅ null |
| 取地址 | ✅ &p 得到指針的指針 | ❌ &ref 返回被引用對象地址 | ❌ 無直接取地址操作 |
| 內存佈局 | 獨立佔用 4/8 字節存地址 | 與原變量共用地址(編譯器實現通常同指針) | 棧上存引用值(指針) |
| 多級間接 | ✅ int**, int***... | ❌ 無引用的引用 | ✅ 隱式多級 |
| 綁定臨時量 | ❌ int* p = &12 非法 | ✅ const int& r = 12 延長壽命 | ✅ 隱式處理 |
// 指針 int x=5, y=6; int* p = &x; p = &y; *p = 10; // y 變 10,x 不變 // 引用 int& r = x; // r = y; // 編譯錯誤:不能重新綁定 // r = y; // 這是賦值操作,將 y 的值賦給 x
int* p = nullptr; // 合法 // int& r = nullptr; // 編譯錯誤
int x = 0; int& r = x; int* p = &x; int* p2 = &r; // p == p2,引用無獨立地址
int x=0, y=0; int* p = &x; int* q = &y; int** pp = &p; pp = &q; **pp = 4; // y=4, x=0
const int& r = 12; // 合法,延長臨時量壽命 // int* p = &12; // 非法
const T& 輸入,T& 輸出),接口自文檔化,避免空指針檢查。C++ 引用 ≈ Java final 變量(初始化後不可指向別的對象),但 C++ 引用語法上表現得像直接操作對象本身(無
./->區分)。
C++ 指針 ≈ Java 普通變量(可重新賦值、可為 null),但 C++ 指針需手動解引用(*p/p->)且涉及內存管理責任。