參考是**物件的別名**,語法上像物件,底層通常實現為**常量指標**(編譯器自動解引用)。宣告時**必須初始化**,之後**不可重新綁定**到其他物件。
int a = 10;
int& ref = a; // ref 綁定 a
ref = 12; // 修改 a 變為 12
cout << &a << "|" << &ref << "|" << a << "|" << ref << endl;
// 輸出:相同地址 | 相同地址 | 12 | 12
void swap(int& x, int& y) { int t=x; x=y; y=t; } // 直接操作實參
void print(const BigObject& obj) { /* 唯讀存取,無拷貝 */ }
BigObject& get_instance() { static BigObject inst; return inst; } // 返回別名
const double& ref = 10 + 1.2f; // 合法!非常量參考 double& 會報錯
// 等價於:
int temp_int = 10;
const double& ref = temp_int + 1.2f; // ref 綁定臨時 double 變數,非原 int a
陷阱:ref 綁定的是**編譯器產生的臨時變數**,而非原 a。修改 a 不影響 ref,ref 也不反映 a 後續變化。
| 特性 | 參考 T& | 指標 T* |
|---|---|---|
| 可為空 | 否(必須綁定有效物件) | 是(nullptr) |
| 可重新綁定 | 否(一生一世) | 是 |
| 語法操作 | 像物件(ref = val) | 需解引用(*ptr = val) |
| 記憶體佔用 | 通常同指標(實現定義) | 指標大小 |
| 適用場景 | 函式參數/返回值、別名、運算子多載 | 動態記憶體、可選參數、資料結構節點 |
| 錯誤 | 後果 | 修正 |
|---|---|---|
int& ref; 未初始化 | 編譯錯誤 | 宣告即初始化 |
| 返回區域變數參考 | 懸空參考,未定義行為 | 返回值或智慧指標 |
const int& ref = func_returning_int(); 以為延長 func 內區域變數壽命 | 延長的是**回傳的臨時物件**,func 內區域變數早已銷毀 | 理解臨時物件實體化規則 |
將 int& 綁定 double 字面值 | 編譯錯誤 | 用 const double& 或 double 值 |
參考是 C++ 型別系統的核心特性,提供**別名語義**、**避免拷貝**、**運算子多載自然語法**、**移動語義基礎**。深入理解 const T& 延長臨時物件壽命的機制與陷阱、左/右值參考綁定規則,是寫出高效、正確、現代 C++ 代碼的關鍵。**參考不是指標的語法糖,而是獨立的型別類別,擁有嚴格的綁定規則與壽命語義。**