教科書常說「參考是物件的別名」,這定義模糊不清,導致初學者誤以為參考是獨立物件。實際上,參考在機器碼層級不存在,它只是編譯期的語法糖,本質是const 指標的語法包裝。
int a = 5; // 假設位址 0x400000
int& b = a; // b 不是新物件,編譯器將 b 視為「位於 0x400000 的 int」
兩重含義:
b 是 int,用法與 int 完全一致(取值、賦值、sizeof、位元運算)。b 綁定 0x400000,底層行為等同 int* const ptr = &a(頂層 const 指標)。b → a 的位址」。b 直接替換為 a 的位址存取(如 mov eax, [0x400000])。int* const)。因此 sizeof(b) == sizeof(a),&b == &a,參考無大小、無獨立位址、不可重新綁定。
| 特性 | C++ Reference | Java Reference |
|---|---|---|
| 可重新綁定 | 否(初始化後固定) | 是(可指向 null 或新物件) |
| 可為 null | 否(除非未定義行為) | 是 |
| 底層對應 | const pointer | pointer(隱藏解引用) |
| 記憶體模型 | 值語意、堆疊/內嵌 | 統一堆上、統一間接存取 |
Java 的「參考」實際對應 C++ 的指標,只是語法上隱藏了 &/*。
std::reference_wrapper 模擬)。const T& ref = expr; 會將臨時物件壽命延長至參考存活期(C++ 標準保證)。const T& 當參數:避免拷貝、支援臨時物件、語意清晰(唯讀)。C++ 參考 = 編譯期綁定的 const 指標語法糖。
它提供「值語意的語法」+「指標語意的效能」,但不佔用記憶體、不支援動態綁定。
理解其「不存在於執行期」的本質,即可避開 90% 的參考相關坑。